求大神指点:SpringMVC使用了jackson-dataformat-xml包之后,不能返回JSON?

发布于 2021-12-03 10:08:35 字数 2877 浏览 847 评论 1

原本使用@ResponseBody返回json数据,但由于需要使用jackson-dataformat-xml包(该包还依赖jackson-module-jaxb-annotations),结果所有response都变成了xml。只要去掉这2个包,就正常了。

看了一下RequestMappingHandlerAdapter源码

以下是默认的构造函数,添加了几个默认的converter

public RequestMappingHandlerAdapter() {
		StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
		stringHttpMessageConverter.setWriteAcceptCharset(false);  // see SPR-7316

		this.messageConverters = new ArrayList<HttpMessageConverter<?>>(4);
		this.messageConverters.add(new ByteArrayHttpMessageConverter());
		this.messageConverters.add(stringHttpMessageConverter);
		this.messageConverters.add(new SourceHttpMessageConverter<Source>());
		this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
	}

最后一行内部如下:根据项目情况,jaxb2Present==true,jackson2Present=true,jackson2XmlPresent=true,gsonPresent=false

	public AllEncompassingFormHttpMessageConverter() {
		addPartConverter(new SourceHttpMessageConverter<Source>());

		if (jaxb2Present && !jackson2Present) {
			addPartConverter(new Jaxb2RootElementHttpMessageConverter());
		}

		if (jackson2Present) {
			addPartConverter(new MappingJackson2HttpMessageConverter());
		}
		else if (gsonPresent) {
			addPartConverter(new GsonHttpMessageConverter());
		}

		if (jackson2XmlPresent) {
			addPartConverter(new MappingJackson2XmlHttpMessageConverter());
		}
	}



所以,看样子是MappingJackson2HttpMessageConverter和MappingJackson2XmlHttpMessageConverter同时都有了。但怎么能禁止xml视图,只返回json呢?

以下是spring配置文件中的内容

<annotation-driven/>
<beans:bean
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:bean
                        class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                <beans:bean
                        class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
                <beans:bean
                        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <beans:property name="objectMapper">
                        <beans:bean class="com.fasterxml.jackson.databind.ObjectMapper">
                            <beans:property name="dateFormat">
                                <beans:bean class="java.text.SimpleDateFormat">
                                    <beans:constructor-arg type="java.lang.String" value="yyyy-MM-dd HH
              

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

够钟 2021-12-03 12:26:43

今天我也遇到了楼主相同的问题,试了试,最终解决了。

首先我定位问题,我的配置文件中启用了<mvc:annotation-driven/>,然后我尝试把这个配置注释掉,很显然返回HTTP错误代码406,把这个配置还原回来,可以返回结果,但是返回的结果还是XML,于是我就去官方文档上查找<mvc:annotation-driven/>这个配置都做了什么(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-message-converters),在文档的22.16.1小节中找到了如下线索:首先创建了一个MappingJackson2HttpMessageConverter,然后如果你当前的classpath中引入了Jackson2 XML的扩展的话,还会创建MappingJackson2XmlHttpMessageConverter。很不幸,后者把前者的功能给覆盖了(这算不算是个bug呢?)于是我搜寻能不能把后者给禁用掉。可惜配置中没有禁用的办法,但是可以配置<mvc:annotation-driven>下的<mvc:message-converters register-defaults="false">节点,注意“register-defaults”属性,它用来设置message-converters的注册方式,默认是true,即按照文档中的初始化顺序一个个地进行注册,如果在<mvc:message-converters>节点下遇到显式的某个message-converter,就会以你的配置为准;如果设置为false,则预设的所有默认message-converter一个都不加载,只加载你在<mvc:message-converters>节点下显式声明的某个message-converter。太棒了,这不就是我要的结果么。所以最终的解决方法:

<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="createXmlMapper" value="false" />
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
</bean>
</property>
</bean>
<!-- 防止@ResponseBody 直接返回String 中文出现乱码 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文