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

作者:专业矮矬穷 时间:2023-06-17 15:24:23 

背景

在接口请求过程中,传递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

标签:springboot,json,post,null
0
投稿

猜你喜欢

  • TOMCAT内存溢出及大小调整的实现方法

    2023-02-24 06:55:33
  • Java基于Javafaker生成测试数据

    2023-11-23 09:36:16
  • C#中的尾递归与Continuation详解

    2021-12-05 16:35:15
  • MAC下如何设置JDK环境变量

    2023-12-20 16:05:24
  • Spring main方法中如何调用Dao层和Service层的方法

    2023-11-28 23:15:19
  • Springboot实现通用Auth认证的几种方式

    2023-08-05 20:54:58
  • Android APP编写简单答题器

    2021-05-29 13:00:17
  • 常用Eclipse快捷方式(推荐)

    2022-01-22 04:37:56
  • 基于FLink实现实时安全检测的示例代码

    2022-05-06 11:03:11
  • Java基于分治法实现的快速排序算法示例

    2023-12-15 07:39:06
  • Android TextView自定义数字滚动动画

    2023-10-03 09:48:17
  • 详解Java中字符流与字节流的区别

    2023-01-14 00:19:58
  • 使用RecyclerView实现点赞头像叠加效果

    2022-12-24 12:10:37
  • 最常用的1000个Java类(附代码示例)

    2023-03-25 20:29:07
  • Java基于zxing生成二维码矩阵过程解析

    2023-11-23 06:04:06
  • C#设计模式之适配器模式与装饰器模式的实现

    2021-10-30 02:54:32
  • Android设置PreferenceCategory背景颜色的方法

    2021-09-24 10:13:29
  • Android开发之自定义加载动画详解

    2023-07-27 01:41:05
  • Java反射(Class类,Class对象获取)

    2021-06-27 05:55:24
  • Java基础将Bean属性值放入Map中的实例

    2023-10-11 13:57:40
  • asp之家 软件编程 m.aspxhome.com