如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?

Posted

技术标签:

【中文标题】如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?【英文标题】:How can I default my spring boot application to application/xml without killing /health? 【发布时间】:2017-02-20 22:11:48 【问题描述】:

我正在开发一个 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 内容类型似乎会破坏执行器的健康检查。有没有办法强制健康检查位和 bobs 忽略默认设置并始终以 JSON 格式生成?

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

非常感谢,

艾德

【问题讨论】:

【参考方案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 发送 header Accept: */*)。

以编程方式发送请求时,您仍然需要在标头中传递Accept: application/json,因为服务需要此媒体类型,但返回的结果将是 XML。

【讨论】:

以上是关于如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用和拆分测试集的情况下将我的数据集拆分为训练和验证?

如何在不使用 ADAL.js 或 MSAL.js 的情况下将我的 activiti 应用程序(版本 6)与 Azure Active Directory 端点 v2.0 集成

我可以在不使用 Route 53 的情况下将我的域和子域指向 AWS 托管吗?

如何在不使用本地PC转换的情况下将我在google colab中训练的tensorflow的protobuf训练模型转换为tensorflowjs?

Jackson 如何在不强制转换的情况下将 JsonNode 转换为 ArrayNode?

如何在不泄露敏感信息的情况下将 Node-Red 推送到 GitHub?