这里有问题。正在测试我的应用程序的他们告诉我,当他们尝试直接将 url 输入到地址中以通过 chrome 查询 GET url 时。我的 api 将始终返回这样的 XML 格式的响应。
但所有响应都应采用 JSON 字符串格式! XML 是 Not Acceptable !
我尝试分析源码,发现chrome直接发送的请求会带有这样的属性:
接受= text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange ;v=b3;q=0.9
内容类型=空
而任何其他应用程序将发送请求:
接受= */* (或接受= application/json)
内容类型=应用程序/json
在这种情况下,由于缺少 content-type 和指定的接受属性,springboot 将响应 chrome 发送的 XML 请求。
有一种方法可以解决这种情况,即在 pom.xml 中排除 XML 的 jackson。但我不认为这是一种优雅的方式。
到目前为止,我拒绝解决这个问题,因为我已经告诉前端代码同事发送指定“application/json”属性的请求,并且没有再次出现问题。
但我仍然认为我有责任解决它,并且应该有更优雅的方法来解决这个问题。
我的应用程序中部署了太多 api,无法为每个 Controller 设置响应类型。我正在为这种情况寻找全局设置。
我认为应该有某种方法像 RequestInterceptor 一样设置请求的 header ,但我发现不可能直接修改网关服务中这些请求的 header 。
请帮我处理这个案子。非常感谢!
最佳答案
听起来您想要定义一个 ContentNegotiationCongiurer。这是一个文档:https://www.baeldung.com/spring-mvc-content-negotiation-json-xml
简短的答案是将这样的内容添加到 Spring 上下文中
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
}
关于java - 如何使用全局设置强制 Spring Boot 返回 Json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66415881/