基于Spring Web Jackson對(duì)RequestBody反序列化失敗的解決
最近在用Spring Web做一些Restful API的實(shí)現(xiàn)試驗(yàn),碰到了@RequestBody 的JSON無法被正常反序列化的問題。服務(wù)端的代碼大致如下:
@RequestMapping(value = "/aquas", method = RequestMethod.POST)
public Aqua createAqua(@RequestBody Aqua aqua) {
return aqua;
}
研究后發(fā)現(xiàn),由于Aqua這個(gè)實(shí)體類缺少了默認(rèn)的無參構(gòu)造函數(shù)(如果自行添加了有參數(shù)的構(gòu)造函數(shù),默認(rèn)的無參構(gòu)造函數(shù)就需要手動(dòng)添加),Spring Web默認(rèn)使用的JSON序列化框架-Jackson就無法正常反序列化。此時(shí)服務(wù)器會(huì)返回400 Bad Request.
解決的方法很多,比較簡單直接的方法是在Aqua這個(gè)實(shí)體類里面加一個(gè)無參的構(gòu)造函數(shù)。比較復(fù)雜的也可通過向Jackson添加強(qiáng)制的轉(zhuǎn)換器的方法讓Jackson理解這個(gè)JSON對(duì)象。
今天這里要介紹的方式是利用注解讓Jackson理解如何反序列化實(shí)體類的JSON。這個(gè)方法更加靈活,也十分簡單。實(shí)體類的部分代碼如下:
@JsonCreator
public Aqua(@JsonProperty("aquaId") String id) {
this.id = id;
}
在自定義的構(gòu)造函數(shù)上面添加@JsonCreator的注解,同時(shí)在參數(shù)上加上@JsonProperty的注解配合使用。加上這兩個(gè)注解之后,Jackson不需要無參構(gòu)造函數(shù)也可以正常反序列化JSON了。
@JsonProperty注解也可以幫助Jackson理解JSON屬性名和實(shí)體類中的變量名不一致的情況。
在這里需要注意,如果有多個(gè)構(gòu)造函數(shù),建議僅僅在一個(gè)構(gòu)造函數(shù)上面加上@JsonCreator注解,以免不必要的麻煩。
補(bǔ)充知識(shí):Springboot springmvc 配置messageConverter(StringHttpMessageConverter)不生效原因解決
解決方法一:不推薦
解決方法如下,因?yàn)槿绻辉O(shè)置register-default='false'Spring 會(huì)默認(rèn)幫我們注冊(cè)7個(gè)messageConvert 如下圖
<bean id="messageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"></constructor-arg>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<mvc:annotation-driven enable-matrix-variables="true" content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters register-defaults="false">
<ref bean="messageConverter"></ref>
</mvc:message-converters>
</mvc:annotation-driven>
如下圖所示,而且StringHttpMessageConverter,網(wǎng)上有人說,需要把mvc:annotation注解移動(dòng)到最后,也有人說,messageConverter需要在mvc-converter之前注入SPring容器,眾說紛紜,不妨試試我這種方法,我的理解應(yīng)該是,Spring會(huì)幫我們注入一些默認(rèn)的,但是這些并不是我們需要的,而且我們?cè)谂渲玫臅r(shí)候,沒有及時(shí)的覆蓋掉Spring默認(rèn)配置的。
所以會(huì)造成配置之后無效果的問題。筆者Spring版本為5.0.3

maven依賴如下
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.3.RELEASE</version> </dependency> <mvc:annotation-driven enable-matrix-variables="true" content-negotiation-manager="contentNegotiationManager"> <mvc:message-converters register-defaults="false"> <ref bean="messageConverter"></ref> <ref bean="jackson2HttpMessageConverter"></ref> </mvc:message-converters> <mvc:path-matching path-helper="mph"></mvc:path-matching> </mvc:annotation-driven>
方法2 ,看看你的文件字符編碼是否正確?
比如有的文件是GBK,有的文件是UTF-8,這種情,無論怎么改都會(huì)亂碼的。
以上這篇基于Spring Web Jackson對(duì)RequestBody反序列化失敗的解決就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempt
這篇文章主要介紹了SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案的相關(guān)資料,需要的朋友可以參考下2016-12-12
@Scheduled定時(shí)器原理及@RefreshScope相互影響
這篇文章主要為大家介紹了@Scheduled定時(shí)器原理及@RefreshScope相互影響詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
springboot登陸頁面圖片驗(yàn)證碼簡單的web項(xiàng)目實(shí)現(xiàn)
這篇文章主要介紹了springboot登陸頁面圖片驗(yàn)證碼簡單的web項(xiàng)目實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
Java中如何將?int[]?數(shù)組轉(zhuǎn)換為?ArrayList(list)
這篇文章主要介紹了Java中將?int[]?數(shù)組?轉(zhuǎn)換為?List(ArrayList),本文通過示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Android讀取本地或網(wǎng)絡(luò)圖片并轉(zhuǎn)換為Bitmap
這篇文章主要為大家詳細(xì)介紹了Android讀取本地或網(wǎng)絡(luò)圖片,并轉(zhuǎn)換為Bitmap,感興趣的小伙伴們可以參考一下2016-08-08
Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問題
這篇文章主要介紹了Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問題的相關(guān)資料,需要的朋友可以參考下2016-10-10
java開發(fā)validate方法中校驗(yàn)工具類詳解
這篇文章主要為大家介紹了java開發(fā)validate方法中校驗(yàn)工具類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

