我正在开发一个Spring-boot(1.4.0-RELEASE)MVC Groovy应用程序,它将呈现一个XML api。默认情况下,Spring似乎连接了Jackson,它将我的响应对象编组为JSON,但是我希望它默认以XML格式响应,而不需要客户端的任何Accept
标头,因此我按如下方式配置了默认内容类型:
@Configuration
class SpringWebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_XML);
}
}
这很好用,但是在运行我们的测试时,我发现调用/health
现在返回406状态代码而没有内容(它先前返回了200和JSON响应)。
恢复上述更改后,我想也许我可以通过使用ResponseEntity
强制每个控制器显式设置响应内容类型,这样做我在控制器方法中尝试了以下内容:
@RequestMapping(value = "/blah",
method = RequestMethod.GET)
ResponseEntity<MyResponseObject> getProgrammeRestrictions(@PathVariable String coreNumber) {
// Generate response object (code snipped)...
new ResponseEntity<MyResponseObject>(myResponseObject,
new HttpHeaders(contentType: MediaType.APPLICATION_XML),
HttpStatus.OK)
}
然而,这似乎并没有影响响应类型,仍然默认为JSON。
简而言之,似乎设置默认的非json内容类型会破坏执行程序的运行状况检查。有没有办法迫使healthcheck位和bobs忽略默认设置并始终以JSON生成?
还有其他人经历过这个吗?感谢任何指针,因为我有点卡在这里。
非常感谢,
埃德
答案 0 :(得分:1)
您需要添加jackson-dataformat-xml
依赖项:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
然后,使其XmlMapper
可用:
@Autowired
private MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter;
@Bean
public ObjectMapper objectMapper(){
// this returns an XmlMapper, which is a subclass of ObjectMapper
return mappingJackson2XmlHttpMessageConverter.getObjectMapper();
}
从浏览器(http://localhost:8080/health)发送请求时有效,返回的结果为XML格式(chrome发送标题为Accept: */*
)。
以编程方式发送请求时,您仍然必须在标头中传递Accept: application/json
,因为服务需要此媒体类型,但返回的结果将是XML。