springboot post接口接受json時(shí),轉(zhuǎn)換為對(duì)象時(shí),屬性都為null的解決
背景
在接口請(qǐng)求過程中,傳遞json對(duì)象,springboot轉(zhuǎn)換為實(shí)體VO對(duì)象后,所有屬性都為null。
post請(qǐng)求:

后臺(tái)接收請(qǐng)求:

當(dāng)時(shí)就懵逼了…
解決心路歷程
查看springboot默認(rèn)的HttpMessageConverter
@Configuration
@Component
public class AppWebConfiguration implements WebMvcConfigurer {
/**
* 重寫添加攔截器方法并添加配置攔截器
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> messageConverter : converters) {
System.out.println(messageConverter);
}
}
}
默認(rèn)的HttpMessageConverter如下:
org.springframework.http.converter.ByteArrayHttpMessageConverter@4ee488a7 org.springframework.http.converter.StringHttpMessageConverter@7c556701 org.springframework.http.converter.StringHttpMessageConverter@1650e1e1 org.springframework.http.converter.ResourceHttpMessageConverter@ffa6a44 org.springframework.http.converter.ResourceRegionHttpMessageConverter@65317aac org.springframework.http.converter.xml.SourceHttpMessageConverter@328b7464 org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@2345d43d org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7f31325b org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@113bd30b
所以解析jason時(shí),用的轉(zhuǎn)換器應(yīng)該是MappingJackson2HttpMessageConverter。
進(jìn)入MappingJackson2HttpMessageConverter進(jìn)行debug調(diào)試,發(fā)現(xiàn),最后轉(zhuǎn)換結(jié)果還真是null!

嘗試直接用objectMapper轉(zhuǎn)換對(duì)象看一下結(jié)果

結(jié)果驚不驚喜,意不意外~。objectMapper把對(duì)象轉(zhuǎn)為json時(shí),屬性變?yōu)?strong>下劃線+小寫風(fēng)格了。
難怪對(duì)象的屬性都為null,壓根屬性都不是同一個(gè)了
看看jackson配置能不能配置轉(zhuǎn)換為駝峰

將命名策略修改為L(zhǎng)OWER_CAMEL_CASE。

再看看轉(zhuǎn)換結(jié)果:

成功轉(zhuǎn)換為駝峰,對(duì)象屬性也完美賦值!
將springboot默認(rèn)的HttpMessageConverter替換為阿里的FastJson轉(zhuǎn)換器MappingJackson2HttpMessageConverter看看效果
@Configuration
public class FastJsonConfiguration {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
List<MediaType> fastMediaTypes = new ArrayList<>();
// 處理中文亂碼問題
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 設(shè)置時(shí)間格式
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
// 在轉(zhuǎn)換器中添加配置信息
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter converter = fastJsonHttpMessageConverter;
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setDefaultCharset(Charset.forName("UTF-8"));
stringConverter.setSupportedMediaTypes(fastMediaTypes);
return new HttpMessageConverters(stringConverter, converter);
}
}
再次查看HttpMessageConverter如下:
com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@15219255 org.springframework.http.converter.ByteArrayHttpMessageConverter@4ee488a7 org.springframework.http.converter.StringHttpMessageConverter@7c556701 org.springframework.http.converter.StringHttpMessageConverter@1650e1e1 org.springframework.http.converter.ResourceHttpMessageConverter@ffa6a44 org.springframework.http.converter.ResourceRegionHttpMessageConverter@65317aac org.springframework.http.converter.xml.SourceHttpMessageConverter@328b7464 org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@2345d43d org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7f31325b org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@113bd30b
發(fā)現(xiàn)FastJsonHttpMessageConverter已經(jīng)在MappingJackson2HttpMessageConverter之前,springboot序列化會(huì)優(yōu)先采用FastJsonHttpMessageConverter。
再次查看接口解析,發(fā)現(xiàn)直接轉(zhuǎn)換到了對(duì)象屬性中。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java動(dòng)態(tài)獲取實(shí)現(xiàn)類的方式詳解
這篇文章主要介紹了Java動(dòng)態(tài)獲取實(shí)現(xiàn)類的方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2024-01-01
從零搭建腳手架之集成Spring?Retry實(shí)現(xiàn)失敗重試和熔斷器模式(實(shí)戰(zhàn)教程)
在我們的大多數(shù)項(xiàng)目中,會(huì)有一些場(chǎng)景需要重試操作,而不是立即失敗,讓系統(tǒng)更加健壯且不易發(fā)生故障,這篇文章主要介紹了從零搭建開發(fā)腳手架之集成Spring?Retry實(shí)現(xiàn)失敗重試和熔斷器模式,需要的朋友可以參考下2022-07-07
Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
SpringMVC中Controller類數(shù)據(jù)響應(yīng)的方法
這篇文章主要介紹了SpringMVC中的數(shù)據(jù)響應(yīng)的問題,主要來了解 Controller 類如何進(jìn)行數(shù)據(jù)響應(yīng)的,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
Spring源碼如何修改Bean的屬性用到的相關(guān)類
這篇文章主要介紹了Spring源碼如何修改Bean的屬性用到的相關(guān)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot基于過濾器和內(nèi)存實(shí)現(xiàn)重復(fù)請(qǐng)求攔截功能
這篇文章主要介紹了SpringBoot基于過濾器和內(nèi)存實(shí)現(xiàn)重復(fù)請(qǐng)求攔截,這里我們使用過濾器的方式對(duì)進(jìn)入服務(wù)器的請(qǐng)求進(jìn)行過濾操作,實(shí)現(xiàn)對(duì)相同客戶端請(qǐng)求同一個(gè)接口的過濾,需要的朋友可以參考下2023-01-01
解決SpringMVC同時(shí)接收J(rèn)son和Restful時(shí)Request里有Map的問題
今天小編就為大家分享一篇解決SpringMVC同時(shí)接收J(rèn)son和Restful時(shí)Request里有Map的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
spring cloud eureka微服務(wù)之間的調(diào)用詳解
這篇文章主要介紹了spring cloud eureka微服務(wù)之間的調(diào)用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07

