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

 更新时间:2021年10月19日 11:06:40   作者:专业矮矬穷  
这篇文章主要介绍了springboot post接口接受json时,转换为对象时,属性都为null的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

背景

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

post请求:

postman调用

后台接收请求:

后台接收请求

当时就懵逼了…

解决心路历程

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

再次查看接口解析,发现直接转换到了对象属性中。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现深度搜索DFS算法详解

    Java实现深度搜索DFS算法详解

    深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点。这篇文章主要介绍了基于Java实现深度优先搜索(DFS)算法,需要的朋友可以参考一下
    2021-12-12
  • Java实现md5和base64加密解密的示例代码

    Java实现md5和base64加密解密的示例代码

    这篇文章主要介绍了Java实现md5和base64加密解密的示例代码,帮助大家更好的利用Java加密解密文件,感兴趣的朋友可以了解下
    2020-09-09
  • 深入Java万物之母Object类详情

    深入Java万物之母Object类详情

    这篇文章主要介绍了Java万物之母Object类详情,Object类,它是所有类的默认父类 ,子类不用使用extends关键字继承它,不管是JDK中的类,还是自定义的类
    2022-06-06
  • Java ThreadLocal的设计理念与作用

    Java ThreadLocal的设计理念与作用

    这篇文章主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java监听器ActionListener与MouseListener的执行顺序说明

    Java监听器ActionListener与MouseListener的执行顺序说明

    这篇文章主要介绍了Java监听器ActionListener与MouseListener的执行顺序说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java数据结构和算法学习之汉诺塔示例

    java数据结构和算法学习之汉诺塔示例

    这篇文章主要介绍了java数据结构和算法中的汉诺塔示例,需要的朋友可以参考下
    2014-02-02
  • Java中字符串String常用方法详解

    Java中字符串String常用方法详解

    这篇文章主要给大家介绍了关于Java中字符串String常用方法的相关资料,String表示字符串类型,是引用数据类型不是基本数据类型,String是类且是最终类,不能有子类,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java NIO与IO的区别以及比较

    Java NIO与IO的区别以及比较

    这篇文章主要介绍了Java NIO与IO的区别以及比较,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 解读Java中char类型相加的问题

    解读Java中char类型相加的问题

    这篇文章主要介绍了解读Java中char类型相加的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • JAVA各种OOM代码示例与解决方法

    JAVA各种OOM代码示例与解决方法

    这篇文章主要给大家介绍了关于JAVA各种OOM代码示例与解决方法的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论