Spring 启动服务器接收参数为 %20 而不是 space

Spring boot server receiving param with %20 instead of space

我有 spring 带有控制器和一个端点的引导服务器:

@GetMapping(path = "/readProperty", produces = "application/json")
public ResponseEntity<ReferenceDataRestResponse> getReferenceDatav4
        (WebRequest request) {
    Map<String, String[]> parametersMap = new HashMap<>(request.getParameterMap());

    ....

}

另一个 spring 启动应用程序正在发送 restTemplate.getForEntity

的请求
String url = UriComponentsBuilder
   .fromHttpUrl(this.referenceDataBaseUrl)
   .path(this.referenceDataReadProperty)
   .queryParams(new LinkedMultiValueMap(multiValueParams))
   .toUriString();
log.info("Reference data URL {}", url);
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);

带有 url 的信息日志打印如下:

Reference data URL http://some-name:8080/readProperty?channel=E&service_name=Some%20Value

问题是,当我使用 curl 命令和 restTemplate.getForEntity 调用此端点时,我在控制器 service_name 中收到不同的参数值

1. Curl

当我从日志中复制此 url 并使用 curl 命令调用它时,如下所示:

curl 'http://some-name:8080/readProperty?channel=E&service_name=Some%20Value'

我的端点正在接收 service_name 参数作为

Some Value

2。 Java 调用 restTemplate.getForEntity(...)

当 java 调用此 url 时:

ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class, new Object[0]);

我的端点正在接收 service_name 参数作为

Some%20Value

3。问题

我应该如何使用 spring 引导准备请求以接收控制器解码参数?

发现问题。

Url 由 java 服务编码两次。一次通过 toUriString(),第二次通过 restTemplate.getForEntity

当我更改发送请求的方法时:

String url = UriComponentsBuilder
   .fromHttpUrl(this.referenceDataBaseUrl)
   .path(this.referenceDataReadProperty)
   .queryParams(new LinkedMultiValueMap(multiValueParams))
   .toString();
log.info("Reference data URL {}", url);
ResponseEntity<String> responseEntity = this.refDataRestTemplate.getForEntity(url, String.class);

然后它起作用了,参数值有空格而不是 %20