久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

基于Spring Web Jackson對(duì)RequestBody反序列化失敗的解決

瀏覽:2日期:2023-08-11 13:33:16

最近在用Spring Web做一些Restful API的實(shí)現(xiàn)試驗(yàn),碰到了@RequestBody 的JSON無(wú)法被正常反序列化的問題。服務(wù)端的代碼大致如下:

@RequestMapping(value = '/aquas', method = RequestMethod.POST)public Aqua createAqua(@RequestBody Aqua aqua) { return aqua;}

研究后發(fā)現(xiàn),由于Aqua這個(gè)實(shí)體類缺少了默認(rèn)的無(wú)參構(gòu)造函數(shù)(如果自行添加了有參數(shù)的構(gòu)造函數(shù),默認(rèn)的無(wú)參構(gòu)造函數(shù)就需要手動(dòng)添加),Spring Web默認(rèn)使用的JSON序列化框架-Jackson就無(wú)法正常反序列化。此時(shí)服務(wù)器會(huì)返回400 Bad Request.

解決的方法很多,比較簡(jiǎn)單直接的方法是在Aqua這個(gè)實(shí)體類里面加一個(gè)無(wú)參的構(gòu)造函數(shù)。比較復(fù)雜的也可通過(guò)向Jackson添加強(qiáng)制的轉(zhuǎn)換器的方法讓Jackson理解這個(gè)JSON對(duì)象。

今天這里要介紹的方式是利用注解讓Jackson理解如何反序列化實(shí)體類的JSON。這個(gè)方法更加靈活,也十分簡(jiǎn)單。實(shí)體類的部分代碼如下:

@JsonCreatorpublic Aqua(@JsonProperty('aquaId') String id) { this.id = id;}

在自定義的構(gòu)造函數(shù)上面添加@JsonCreator的注解,同時(shí)在參數(shù)上加上@JsonProperty的注解配合使用。加上這兩個(gè)注解之后,Jackson不需要無(wú)參構(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 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)上有人說(shuō),需要把mvc:annotation注解移動(dòng)到最后,也有人說(shuō),messageConverter需要在mvc-converter之前注入SPring容器,眾說(shuō)紛紜,不妨試試我這種方法,我的理解應(yīng)該是,Spring會(huì)幫我們注入一些默認(rèn)的,但是這些并不是我們需要的,而且我們?cè)谂渲玫臅r(shí)候,沒有及時(shí)的覆蓋掉Spring默認(rèn)配置的。

所以會(huì)造成配置之后無(wú)效果的問題。筆者Spring版本為5.0.3

基于Spring Web Jackson對(duì)RequestBody反序列化失敗的解決

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,這種情,無(wú)論怎么改都會(huì)亂碼的。

以上這篇基于Spring Web Jackson對(duì)RequestBody反序列化失敗的解決就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 麻江县| 麦盖提县| 阿拉善左旗| 灵璧县| 日喀则市| 青岛市| 建始县| 凤冈县| 富源县| 西安市| 屏东县| 耿马| 宜川县| 洛隆县| 钦州市| 七台河市| 大田县| 搜索| 吴忠市| 台前县| 彭阳县| 连云港市| 久治县| 华安县| 富民县| 阿拉善左旗| 科尔| 长汀县| 洪湖市| 沐川县| 大港区| 杭州市| 漳州市| 怀远县| 沙洋县| 竹溪县| 洪泽县| 大名县| 三江| 民权县| 孙吴县|