【问题标题】:Spring 5 -jackson-dataformat-xml forces @ResponseBody with XMLSpring 5 -jackson-dataformat-xml 使用 XML 强制 @ResponseBody
【发布时间】:2021-03-22 18:57:50
【问题描述】:

我必须在一个遗留的 spring 5 [not boot] 项目上工作,我面临着类似的问题jackson-dataformat-xml turns @ResponseBody to XML 所以我开始使用 XMLMapper - 输入是应用程序/文本 [这是 xml 字符串],输出应该是控制器中的 json。但是我一添加依赖项就看到了

<dependency>
<artifactId>jackson-dataformat-xml</artifactId>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<version>2.10.2</version>
</dependency>

响应似乎不再是 JSON,而是 xml 我无法弄清楚应该做什么。我需要使用 xmlmapper 来避免 JAXB2 。任何示例配置。 [Java 配置也可以,但不要使用 java 8 lambda 函数,因为它没有在这个遗留系统中使用[因为我们有某些遗留依赖项,比如 checkstyle 在这个项目中没有升级到 java 8。] 会有所帮助......让我知道.

我目前有以下配置,但我认为问题在于依赖关系。因此需要在配置中进行一些调整:

@Configuration
public class HttpResponseConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));

    }
}

【问题讨论】:

  • 这可能与注册的顺序有关,尤其是当*/* 存在时。这最近也反映在 Javadoc github.com/spring-projects/spring-framework/commit/…
  • @RossenStoyanchev 有多个地方。对于控制器,除了 extendMessageConverters 之外,我还必须在 configureContentNegotiation 中设置 defaultContentType 。该应用程序还使用了 Apache http 客户端,它是来自服务的包装器调用,它们也开始返回 xml 。对于应用程序/json,我必须使用 q =1 修复接受标头。我将尝试在 github 上发布示例玩具并在此处链接。简而言之,如果你在这个 lib 项目中使用,来自 Apache http 客户端的响应也会受到影响。

标签: spring spring-boot jackson-dataformat-xml


【解决方案1】:

您是否尝试过指定响应类型?

@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody

https://www.baeldung.com/spring-request-response-body

【讨论】:

  • 我不想添加它,它可能会起作用。由于有太多的方法和控制器,它将在遗留系统中工作太多。理想情况下,配置会很好。
【解决方案2】:

您是否在 HTTP 请求中设置了 ACCEPT 标头?如果 spring 被配置为返回这两种类型,那么你应该将 ACCEPT 头设置为所需的类型。

【讨论】:

  • ResponseBody 中的默认 JSON 类型是我们所需要的。对于少数 1 或 2 个控制器,旧版客户端将应用程序/文本作为 XML 字符串发送到标头中,但需要在 JSON 中响应。对于剩余的所有客户端请求标头,接受 application/json 和 JSON 响应。
【解决方案3】:

我需要修复多个地方。我们还使用 Apache HTTP Client 来调用后端服务。这些服务的响应也被破坏了[他们开始重新调整 xml]。因为它是一段普通的代码,所以我修改了 json 的 q=1 的“Accept”标头。 http.setHeader("Accept","application/json;q=1, text/html;q=0.9, application/xhtml+xml;q=0.9, application/xml;q=0.8, */*;q=0.7");

然后是必须修复的 Spring 控制器。我必须同时配置消息转换器和内容协商


@Configuration
@EnableWebMvc
public class HttpResponseConfig implements WebMvcConfigurer {
    @Autowired
    ObjectMapperFactory objectMapperFactory;//custom

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapperFactory.getObjectMapper());
        return converter;
    }

    @Override
    public void extendMessageConverters(final List<HttpMessageConverter<?>> converters) {
        converters.add(0, new MappingJackson2HttpMessageConverter(mappingJackson2HttpMessageConverter().getObjectMapper()));

    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2019-11-09
    • 2017-01-11
    • 2016-03-02
    • 2019-08-03
    • 2021-12-23
    • 2017-01-10
    相关资源
    最近更新 更多