Java Spring resttemplate字符编码

时间:2014-12-22 13:35:53

标签: java json utf-8 character-encoding resttemplate

我正在使用Java Spring Resttemplate通过get请求获取json。我得到的JSON不是特殊字符,而是someöä或ß一些奇怪的东西。所以我猜这个字符编码有些不对劲。我在互联网上找不到任何帮助。我现在使用的代码是:

String json = restTemplate.getForObject(
    overPassStatementPostCode,
    String.class,
    params);

5 个答案:

答案 0 :(得分:65)

您只需将StringHttpMessageConverter添加到模板的消息转换器中:

RestTemplate template = new RestTemplate();
template.getMessageConverters()
        .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
ResponseEntity<Object> response = template.exchange(endpoint, method, entity, 
                                                    Object.class);

答案 1 :(得分:1)

首先我尝试了@beerbajay的方式,但它没有帮助。最后我通过以下方式解决它

        RestTemplate template = new RestTemplate();
//      template.getMessageConverters()
//              .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(newArrayList(MediaType.APPLICATION_JSON));
        ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, new HttpEntity<String>(headers), String.class);

答案 2 :(得分:1)

我在这个问题上遇到同样的问题,经过一次搜索,我得到了这个链接: https://gist.github.com/knight1128/66f3e4817ab35c7397fd

它的解决方法对我有用:

apply

答案 3 :(得分:0)

我已经解决了这个问题。我需要使用UTF-8在请求正文中发布一个字符串对象。

文本/纯文本

httpHeaders.setContentType(new MediaType(“ text”,“ plain”,StandardCharsets.UTF_8));

applicaton / json

httpHeaders.setContentType(new MediaType(“ applicaton”,“ json”,StandardCharsets.UTF_8));

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resposeEntity = null;

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(new MediaType("text", "plain", StandardCharsets.UTF_8));

HttpEntity<String> httpEntity = new HttpEntity<String>(stringContent, httpHeaders);
responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class);

if (HttpStatus.OK.equals(responseEntity.getStatusCode())) {
    logger.debug("... success ... result: " + responseEntity.getBody());
}

答案 4 :(得分:0)

如果可以执行以下操作,则仍然可以将String.class用作响应类型。

升级到spring-web 5.2解决了该问题。或将writeAcceptCharset属性设置为false属于StringHttpMessageConverter,并在RestTemplate实例中进一步使用该转换器。

boolean writeAcceptCharSet = false;
List<HttpMessageConverter<?>> c = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> mc : c) {
  if (mc instanceof StringHttpMessageConverter) {
    StringHttpMessageConverter mcc = (StringHttpMessageConverter) mc;
    mcc.setWriteAcceptCharset(writeAcceptCharSet);
  }
}