关于Spring MVC 3.1.x中如何替换数据Converter的问题

六月ゝ 毕业季﹏ 提交于 2019-11-27 04:17:56

#参考文献(15-09-20补充):

#参考的原文 http://www.cnblogs.com/yangzhilong/p/3725849.html #要解决的问题 Web API的开发中,经常需要对HTTP中的request body中的数据流绑定到自建Model中,或者将自建Model反序列化到Response Body中。这时候就需要用到这些Converter。而这些默认配置下的Converter可能得不到你想要的结果。 #如何解决 这里仅对Json相关的转换做出说明。由于Spring默认使用的是jackson,而jackson的ObjectMapper有一些可选配置。 例如你自建的model如下

<!-- lang: java -->
class student {
private String name;
private String gender;

}

而你接收的json

{
    "name": "jacob",
    "gender": "F",
}

那么,这样是可以绑定上去的, 但如果某一天,另外一个系统将这个json扩充后,并且没有及时通知你,比如

{
    "id": 1,
    "name": "jacob",
    "gender": "F",
    "age": 12,
    "grade": 5
}

这样,你的程序应该直接出错。 而,jackson的ObjectMapper的配置org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES调成false后,可以忽略多余字段。 所以需要修改下默认的jackson的配置。即找到spring mvc关于Converter的注册的地方,然后替换成自己加工过的Converter。 #原理解析 spring mvc中, 有个简写的配置,mvc:annotation-driven,这个很简洁,但是不看官方说明,不知道是干嘛的,其实这个配置就是

<!-- lang: xml -->
<!-- <mvc:annotation-driven /> -->
<!-- START replace <mvc:annotation-driven /> -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <ref bean="converters"/>
    </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="messageConverters">
        <ref bean="converters"/>
    </property>
</bean>
<bean id="byteArray" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean id="string" class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean id="resource" class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<bean id="source" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean id="xmlAwareForm" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<bean id="jaxb2RootElement" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
<bean id="json" class="xxx.GamingJacksonConverter" />
<bean id="converters" class="java.util.ArrayList">
    <constructor-arg>
        <list>  
            <ref bean="byteArray" />
            <ref bean="string" />
            <ref bean="resource" />
            <ref bean="source" />
            <ref bean="xmlAwareForm" />
            <ref bean="jaxb2RootElement" />
            <ref bean="json" />
        </list>
    </constructor-arg>
</bean>
<!-- END -->

所以直接把这个写上,去掉简写的,然后将spring MVC的jackson换成自己的,便大功告成。 #其他事项 在mvc:annotation-driven conversion-service=""中有个这个配置,这个会将你的覆盖之前的(应该是之前所有默认配置,不清楚,美研究),也可以用用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!