#参考文献(15-09-20补充):html
#参考的原文 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以下java
<!-- lang: java --> class student { private String name; private String gender;
}web
而你接收的jsonspring
{ "name": "jacob", "gender": "F", }
那么,这样是能够绑定上去的, 但若是某一天,另一个系统将这个json扩充后,而且没有及时通知你,好比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,这个很简洁,可是不看官方说明,不知道是干吗的,其实这个配置就是mvc
<!-- 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=""中有个这个配置,这个会将你的覆盖以前的(应该是以前全部默认配置,不清楚,美研究),也能够用用。app