服务器之家

服务器之家 > 正文

springboot post接口接受json时,转换为对象时,属性都为null的解决

时间:2022-02-23 00:32     来源/作者:专业矮矬穷

背景

在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。

post请求:

springboot post接口接受json时,转换为对象时,属性都为null的解决

后台接收请求:

springboot post接口接受json时,转换为对象时,属性都为null的解决

当时就懵逼了…

 

解决心路历程

查看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!

springboot post接口接受json时,转换为对象时,属性都为null的解决

尝试直接用objectMapper转换对象看一下结果

springboot post接口接受json时,转换为对象时,属性都为null的解决

结果惊不惊喜,意不意外~。objectMapper把对象转为json时,属性变为下划线+小写风格了。

难怪对象的属性都为null,压根属性都不是同一个了

看看jackson配置能不能配置转换为驼峰

springboot post接口接受json时,转换为对象时,属性都为null的解决

将命名策略修改为LOWER_CAMEL_CASE。

springboot post接口接受json时,转换为对象时,属性都为null的解决

再看看转换结果:

springboot post接口接受json时,转换为对象时,属性都为null的解决

成功转换为驼峰,对象属性也完美赋值!

将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

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部