背景
在接口請求過程中,傳遞json對象,springboot轉換為實體VO對象后,所有屬性都為null。
post請求:
后臺接收請求:
當時就懵逼了…
解決心路歷程
查看springboot默認的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); } } }
默認的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時,用的轉換器應該是MappingJackson2HttpMessageConverter。
進入MappingJackson2HttpMessageConverter進行debug調試,發現,最后轉換結果還真是null!
嘗試直接用objectMapper轉換對象看一下結果
結果驚不驚喜,意不意外~。objectMapper把對象轉為json時,屬性變為下劃線+小寫風格了。
難怪對象的屬性都為null,壓根屬性都不是同一個了
看看jackson配置能不能配置轉換為駝峰
將命名策略修改為LOWER_CAMEL_CASE。
再看看轉換結果:
成功轉換為駝峰,對象屬性也完美賦值!
將springboot默認的HttpMessageConverter替換為阿里的FastJson轉換器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); // 設置時間格式 fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); // 在轉換器中添加配置信息 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
發現FastJsonHttpMessageConverter已經在MappingJackson2HttpMessageConverter之前,springboot序列化會優先采用FastJsonHttpMessageConverter。
再次查看接口解析,發現直接轉換到了對象屬性中。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/jiangjun0130/article/details/89210172