springboot引入ackson Dataformat XML后原本返回json的却返回xml
- springboot引入jackson Dataformat XML后原本返回json的却返回xml
- 问题原因
- 解决方式
- 最后说明
springboot引入jackson Dataformat XML后原本返回json的却返回xml
今天项目需要生成xml文件,才引入了jackson2的依赖,后来写完才发现原本返回json格式的数据都变成了xml,找了好多博客都没有解决。希望这篇博客能帮助到大家。
问题原因
本人学艺不精,目前为止只能看出来引入jackson2后,有个叫configureContentNegotiation(配置内容协商,大概作用是控制返回的类型,详情请看看springmvc的执行流程,反正我已经忘了)会增加对xml的支持。增加前后的对比如下:
//添加依赖前
org.springframework.http.converter.ByteArrayHttpMessageConverter@53ec6b78
org.springframework.http.converter.StringHttpMessageConverter@86862c4
org.springframework.http.converter.StringHttpMessageConverter@3bd45da5
org.springframework.http.converter.ResourceHttpMessageConverter@1cd56bd0
org.springframework.http.converter.ResourceRegionHttpMessageConverter@61fcbf84
org.springframework.http.converter.xml.SourceHttpMessageConverter@517baf68
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@48dbe997
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@468ea69a
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7fe790b7
org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@7b630050
//添加依赖后
org.springframework.http.converter.ByteArrayHttpMessageConverter@72ed3aa
org.springframework.http.converter.StringHttpMessageConverter@3cb9cba5
org.springframework.http.converter.StringHttpMessageConverter@2bb37ac4
org.springframework.http.converter.ResourceHttpMessageConverter@3f45ef58
org.springframework.http.converter.ResourceRegionHttpMessageConverter@24b8c53c
org.springframework.http.converter.xml.SourceHttpMessageConverter@55faf182
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@652fd4a3
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@5db86801
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7500c871
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@35ad8cf1
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@177372c8
反正就是多了,我不管(傲娇)。这里其实只是增加了对xml的支持,其实到这里影响不大。主要的原因还是在浏览器
别问我是什么浏览器,问就是谷歌。看的出在请求头部,浏览器对xml的支持有限级很高,这样的话我们的json就会被xml挤下去(心疼json两秒钟)。
解决方式
原因也知道了,一下是我总结的3种方案,总有一种适合你。bui bui bui
- 首先就是最简单的,移除jackson Dataformat XML依赖(这种好蠢呀,我都不想往上写。此处省略好多表情)
<!-- 就是他 删了就行了--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency>
- 在请求的时候指定json格式返回 produces = “application/json” 就可以了(太麻烦,每个都要加)
@RequestMapping(value = "generateXml",produces = "application/json")public ResultUtil generateXml(Integer id) throws IOException {代码省略...}
- 最后一种就是配置configureContentNegotiation,简单说就是把jackson Dataformat XML加个xml支持给干掉。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {/**** @Author: lzl* @Date: 2023/5/25 13:57* @return: void* @Description: 这是排除掉xml格式的返回值,如果需要使用xml返回请注掉本块代码*/@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {List<HttpMessageConverter<?>> converterList = new ArrayList<>();for (HttpMessageConverter<?> converter : converters) {if (!converter.getClass().equals(MappingJackson2XmlHttpMessageConverter.class)) {converterList.add(converter);}}converters.clear();converters.addAll(converterList);}/**** @Author: lzl* @Date: 2023/5/25 13:57* @return: void* @Description: 这个是默认json返回,我感觉没有实际作用*/@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.defaultContentType(MediaType.APPLICATION_JSON);}
}
- 这一种不算解决,只是说明一下,如果系统想要同时支持json和xml上面的都不需要配置,只需要前端请求的时候指定一下头部信息就可以了
最后说明
这玩意咋加表情呀,我找了半天没找到,知道的请吱一声。