如何在没有查杀/健康的情况下将我的Spring启动应用程序默认为application / xml?

时间:2016-10-12 07:36:19

标签: json xml spring spring-mvc spring-boot

我正在开发一个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生成?

还有其他人经历过这个吗?感谢任何指针,因为我有点卡在这里。

非常感谢,

埃德

1 个答案:

答案 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。