java - 如何使用全局设置强制 Spring Boot 返回 Json 响应

标签 java spring-boot testing

这里有问题。正在测试我的应用程序的他们告诉我,当他们尝试直接将 url 输入到地址中以通过 chrome 查询 GET url 时。我的 api 将始终返回这样的 XML 格式的响应。 enter image description here

但所有响应都应采用 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/

相关文章:

java - Spring Boot 开发者工具自动重启在 IntelliJ 中不起作用

java - Spring Boot 项目设置设计决策

Python:为模块及其导入设置 __globals__

unit-testing - 事后单元测试的优缺点

Java 扩展示例

java - 在我的应用程序中,我需要记录每个来电和去电

spring-mvc - Spring Boot + React.js Axios : 403 Forbidden for HTTP POST calls

ruby - 嵌套 RSpec 测试

java - Maven 构建未在 Jenkins 上安排

java - 如何正确使用switch语句?