@RequestBody:Unrecognized field , not marked as ignorable問題

好久沒寫啦…看來以後要經常寫啊….
解決方法一:
可以增加一個字段來接收前臺傳來的這個值,如果存在多個字段,這種方式很不好(就算一個字段,如果沒用,新增字段也不好)。
解決方法二:
在前臺往後臺傳值的時候,去掉無用的字段。這樣還能減少網絡傳輸的大小。
解決方法三:
還有一些方法,這些方法主要是使用Jackson提供的json註解。
@JsonIgnore註解用來忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法時,和Filed效果一樣。這個註解只能用在POJO存在的字段要忽略的情況,不能滿足現在需要的情況。
@JsonIgnoreProperties(ignoreUnknown = true),將這個註解寫在類上之後,就會忽略類中不存在的字段,可以滿足當前的需要。這個註解還可以指定要忽略的字段。使用方法如下:
@JsonIgnoreProperties({ “internalId”, “secretKey” })
指定的字段不會被序列化和反序列化。
解決方案四:
Spring MVC中JSON支持未定義的字段的配置:
在spring的servlet applicationContext.xml中加入以下代碼就可以支持了

<mvc:message-converters register-defaults="false">
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <constructor-arg index="0" value="utf-8"/>
    </bean>
    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
    <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter" />
    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper">
            <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                <property name="featuresToDisable">
                    <util:constant static-field="com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES" />
                </property>
            </bean>
        </property>
    </bean>
</mvc:message-converters>

一個方法中只能有一個@RequestBody註解。
默認情況下@RequestBody標註的對象必須包含前臺傳來的所有字段。
第一條容易理解,因爲RequestBody就是request的inputStream,這個流在第一次使用該註解後會關閉,後面的都會報錯(stream closed)。
第二條如果沒有包含前臺傳來的字段,就會報錯:Unrecognized field xxx , not marked as ignorable,這是因爲MappingJacksonHttpMessageConverter默認要求必須存在相應的字段。如果沒有前臺傳來的某個字段,就會報錯。

看似代碼很多其實修改只有這一行,這一行用於配置ObjectMapper支持反序列化未知屬性。

由於Spring MVC默認註冊了以上的MessageConverter,但對默認註冊的MessageConverter只能保留然後添加新的MessageConverter,然而我們要修改的就是其默認註冊的MappingJackson2HttpMessageConverter,所以只能設置register-defaults=”false”然後拷貝其默認註冊的所有MessageConverter並修改MappingJackson2HttpMessageConverter的ObjectMapper用於支持我們的未定義的屬性的反序列化。

注:解析json到後端bean的引擎需能夠解析@JsonIgnoreProperties註解(fastxml)
swagger不用配置(swagger採用的是spring的objectMapper,所以配置了spring就行)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章