我有2个春季启动休息服务,它们作为生产者和消费者相互作用。一个是JSON内容的生产商,另一个是消费者。
在消费者服务中,我使用Spring的RestTemplate
调用生产者的终点并获得结果。
代码
制作人对Controller的端口端点的相关代码如下:
@RequestMapping(value = "/cars", method = RequestMethod.POST)
public ResponseEntity<Cars> getCars(/* methods params */) {
// some code here
HttpHeaders respHeader = new HttpHeaders();
respHeader.set("Content-Type", "application/json");
ResponseEntity<Cars> resp = new ResponseEntity<Cars>(cars, respHeader, HttpStatus.OK);
return resp;
}
在上面的生产者代码中注意:
- 我在
RequestMapping
注释中没有明确指定produces="application/json"
。 - 但是,我将内容类型设置为"应用/json"在响应标题中。
问题
,但消费者在XML而不是JSON中获得响应。杰克逊在班级路径中。
问题
即使内容类型明确设置为" application/json??
(,什么解释了返回XML而不是JSON假设响应标头没有任何效果,默认值是什么 - 是XML而不是JSON?
看来httpmessageconverters的顺序很重要。当存在传递XML依赖关系时,我遇到了默认XML响应的同样问题。将MappingJackson2HttpMessageConverter添加到转换器列表的顶部为我解决。
由于某种原因,configurer.defaultContentType(MediaType.APPLICATION_JSON)
此建议中的建议破坏了产生JSON以外的媒体类型的API(当请求不包含Accept
标头时(。这些API开始以JSON为DefaultContentType
我的春季启动版本是2.7.1
这是配置类:
@Configuration
@RequiredArgsConstructor
public class WebMvcConfiguration implements WebMvcConfigurer {
private final ObjectMapper objectMapper;
@Override
public void extendMessageConverters(@NotNull List<HttpMessageConverter<?>> converters) {
converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
}
}
未定义默认内容类型时,XML将成为默认值,因为Spring在转换器上迭代以决定可生产的内容类型。并且由于在JSON转换器之前添加XML转换器,因此它使用XML。在XML转换器之前添加JSON转换器修复了此操作。
您可以通过自定义Spring的WebMvcConfigurer
。
这样做,将以下代码添加到用@Configuration
注释的给定配置类:
@Bean
public WebMvcConfigurer customConfigurer() {
return new WebMvcConfigurer() {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
};
}
您可以在春季的ContentTypeDelegatingMessageConverter
中设置一个断点,然后调试以查看已解决的消息 - 连接器的响应。
内容谈判
确定响应内容类型的Web-Client和-Server之间的概念和过程称为内容 - 访问。
自春季MVC以来,注册的WebMvcConfigurer
和HttpMessageConverters
负责响应的表示和内容类型。
在Springboot中,这些都是自动配置的。
对于任何@RestController
或具有@ResponseBody
的控制器 - 端口,响应的默认内容类型为XML,如果jackson在classPath中可用并且已成功进行自动配置,则默认内容类型应为JSON。
另请参见:
- baeldung的教程:春季MVC内容谈判
- 如何使Spring Boot默认为应用程序/JSON; CHARSET = UTF-8而不是应用程序/JSON; CHARSET = ISO-8859-1