關於Spring MVC 3.1.x中如何替換數據Converter的問題

#參考文獻(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

相關文章
相關標籤/搜索