+
 新版

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

Sel8616 发布于 2016/02/25 02:07
阅读 3K+
收藏 0

原本使用@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🇲🇲ss"/>
                                </beans:bean>
                            </beans:property>
                        </beans:bean>
                    </beans:property>
                    <beans:property name="supportedMediaTypes">
                        <beans:list>
                            <beans:value>application/json;charset=UTF-8</beans:value>
                        </beans:list>
                    </beans:property>
                </beans:bean>
                <beans:bean
                        class="org.springframework.http.converter.StringHttpMessageConverter">
                    <beans:constructor-arg value="UTF-8"></beans:constructor-arg>
                    <beans:property name="supportedMediaTypes">
                        <beans:list>
                            <beans:value>text/plain;charset=UTF-8</beans:value>
                        </beans:list>
                    </beans:property>
                </beans:bean>
            </beans:list>
        </beans:property>
    </beans:bean>


加载中
0
jangels
jangels

大神问下,这个是post和get都无法转换成json吗, 我们项目正好遇到了这个问题,但是post可以转成json,get请求不行,知道什么问题么 

0
y
yue_zxl

spring 默认会有个后缀匹配,默认.json返回json数据,.html等返回页面,.xml会返回xml数据,当然前提是有相关的依赖包。想要关这个默认后缀匹配。 favorPathExtension 这个就是对应默认扩展名的。关闭后缀匹配之后会根究你指定的返回类型返回相应的结果。

<bean id="contentNegotiationManager"
  class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="false"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
    <property name="useJaf" value="false" />
</bean>

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部