Spring 5 -jackson-dataformat-xml 用 XML 强制 @ResponseBody
Spring 5 -jackson-dataformat-xml forces @ResponseBody with XML
我必须处理遗留 spring 5 [not boot] 项目,我面临类似的问题 jackson-dataformat-xml turns @ResponseBody to XML
所以我开始使用 XMLMapper - 输入是 application/text [这是 xml string] 并且输出应该 json in controllers 。但是我一添加依赖就看到了
<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()));
}
}
您尝试过指定响应类型吗?
@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
您是否在 HTTP 请求中设置了 ACCEPT header?如果 spring 配置为 return 两种类型,那么您应该将 ACCEPT header 设置为所需的类型。
我有多个地方需要修复。我们还使用 Apache HTTP Client 来调用后端服务。这些服务的响应也中断了 [他们开始重新调整 xml]。由于这是一段普通代码,我将“接受”header 修改为 json 的 q=1。
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);
}
}
我必须处理遗留 spring 5 [not boot] 项目,我面临类似的问题 jackson-dataformat-xml turns @ResponseBody to XML 所以我开始使用 XMLMapper - 输入是 application/text [这是 xml string] 并且输出应该 json in controllers 。但是我一添加依赖就看到了
<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()));
}
}
您尝试过指定响应类型吗?
@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
您是否在 HTTP 请求中设置了 ACCEPT header?如果 spring 配置为 return 两种类型,那么您应该将 ACCEPT header 设置为所需的类型。
我有多个地方需要修复。我们还使用 Apache HTTP Client 来调用后端服务。这些服务的响应也中断了 [他们开始重新调整 xml]。由于这是一段普通代码,我将“接受”header 修改为 json 的 q=1。
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);
}
}