Spring Boot singleton RestTemplate Accept Header一直被追加到

时间:2016-01-28 17:01:37

标签: spring spring-mvc spring-boot

使用Spring Boot(1.3.0.RELEASE)。 我需要使用RestTemplate调用许多不同的REST Web服务。 显然,我不想每次调用时都创建一个RestTemplate的新实例,所以我为RestTemplate的单个实例创建了一个配置:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

以上是Autowired到许多需要调用外部REST服务的类......有很多!还有一些要GET,有些要做POST

USAGE ------------------------
ResponseEntity<String> response =
getRestTemplate().exchange(getUri(), HttpMethod.GET, request, String.class);

USAGE------------------------ 
getRestTemplate().getMessageConverters().add(new StringHttpMessageConverter());            
String response = getRestTemplate().getForObject(getUri(), String.class, toc);
------------------------

所以我注意到Accept Http Header存在问题。它似乎保持GROWING,即它被附加到。我没有在我的代码中设置任何Accept标头!这就是我在LOG中看到的。

     [http-nio-9080-exec-1] o.s.web.client.RestTemplate              
: Setting request Accept header to [text/plain, application/json,
 application/*+json, text/plain, text/plain, text/plain, text/plain, 
text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, */*, */*, */*, */*, */*, */*, */*, */*, 
*/*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, 
*/*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, 
*/*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, 
*/*, */*, */*, */*, */*, */*]

这可能会增长并最终获得400(BAD REQUEST)

org.springframework.web.client.HttpClientErrorException: 400 Bad Request
        at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) ~[spring-web-4.2.3.RELEASE.jar!/:4.2.3.RELEASE]
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) ~[spring-web-4.2.3.RELEASE.jar!/:4.2.3.RELEASE]
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) ~[spring-web-4.2.3.RELEASE.jar!/:4.2.3.RELEASE]
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) ~[spring-web-4.2.3.RELEASE.jar!/:4.2.3.RELEASE]
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:264) ~[spring-web-4.2.3.RELEASE.jar!/:4.2.3.RELEASE]

RestTemplate被声明为单例bean实例的问题是什么?即因为可以调用许多web服务,所以使用相同的RestTemplate,因此Accept Header不断增长?

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

由于您的@Bean方法会返回一个单例,因此当您调用该方法时,您始终会获得相同的RestTemplate实例(每次都不会获得新的实例)。

在您的使用部分中,您似乎每次使用此REST模板时都会添加StringHttpMessageConverter。一遍又一遍地添加此消息转换器可能是它添加新的Accept标头的原因。

将您的邮件转换器配置移至@Bean方法,问题将消失。

答案 1 :(得分:0)

为什么不在代码中设置请求标头?以下几行中的内容

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
ResponseEntity<String> result = restTemplate.exchange(getUri(), HttpMethod.GET, entity, String.class);