在spring boot web 项目中,当使用json格式接收数据和返回数据的时候,spring boot 默认使用一个objectmapper实例来序列化响应和反序列化请求。
在本文中,我们将看看配置序列化和反序列化选项的最常用方法。
默认配置默认情况下,spring boot的配置将禁用以下配置项。
mapperfeature.default_view_inclusiondeserializationfeature.fail_on_unknown_propertiesserializationfeature.write_dates_as_timestamps。举个例子
客户端将发送一个get请求到我们的/coffee?name=javazzz。控制器将返回一个新的coffee对象。spring将使用objectmapper将我们的pojo序列化为json。我们将通过使用string和localdatetime对象来示范定制选项。
public class coffee { private string name; private string brand; private localdatetime date; //getter and setter}我们还将定义一个简单的rest控制器来演示序列化。
@getmapping(/coffee)public coffee getcoffee( @requestparam(required = false) string brand, @requestparam(required = false) string name) { return new coffee() .setbrand(brand) .setdate(fixed_date) .setname(name);}默认情况下,这将是调用get http://lolcahost:8080/coffee?brand=javazzz 时的响应。
{ name: null, brand: javazzz, date: 2022-06-16t10:21:35.974}我们希望排除空值,并有一个自定义的日期格式(dd-mm-yyyy hh:mm)。这就是我们的响应结果。
{ brand: javazzz, date: 06-11-2022 10:34}在使用spring boot时,我们可以选择定制默认的objectmapper或覆盖它。我们将在接下来的章节中介绍这两个选项。
自定义默认的objectmapper在本节中,我们将看到如何定制spring boot使用的默认objectmapper。
1.应用程序属性和自定义 jackson 模块配置映射器的最简单方法是通过应用程序属性。
下面是配置的一般结构。
spring.jackson..=true,false作为一个例子,下面是我们要添加的内容,以禁用serializationfeature.write_dates_as_timestamps。
spring.jackson.serialization.write-dates-as-timestamps=false除了提到的特征类别,我们还可以配置属性的包含。
spring.jackson.default-property-inclusion=always, non_null, non_absent, non_default, non_empty配置环境变量是最简单的方法。这种方法的缺点是,我们不能定制高级选项,比如为localdatetime定制日期格式。
在这一点上,我们会得到这样的结果。
{ brand: javazzz, date: 2022-06-16t10:35:34.593}为了实现我们的目标,我们将注册一个新的javatimemodule,用我们的自定义日期格式。
@configuration@propertysource(classpath:coffee.properties)public class coffeeregistermoduleconfig { @bean public module javatimemodule() { javatimemodule module = new javatimemodule(); module.addserializer(local_datetime_serializer); return module; }}另外,配置属性文件coffee.properties将包含以下内容。
spring.jackson.default-property-inclusion=non_nullspring boot会自动注册任何类型为com.fastxml.jackson.databind.module的bean。下面是我们的最终结果。
{ brand: javazzz, date: 16-06-2022 10:43}2.jackson2objectmapperbuildercustomizer这个功能接口的目的是让我们创建配置。
它们将被应用于通过jackson2objectmapperbuilder创建的默认objectmapper。
@beanpublic jackson2objectmapperbuildercustomizer jsoncustomizer() { return builder - > builder.serializationinclusion(jsoninclude.include.non_null) .serializers(local_datetime_serializer);}配置得以特定的顺序应用,我们可以使用@order annotation来控制。如果我们想从不同的配置或模块来配置objectmapper,这种优雅的方法是适合的。
重写默认配置如果我们想完全控制配置,有几个选项可以禁用自动配置,只允许应用我们的自定义配置。
让我们仔细研究一下这些选项。
1.objectmapper覆盖默认配置的最简单方法是定义一个objectmapper bean并将其标记为@primary。
@bean@primarypublic objectmapper objectmapper() { javatimemodule module = new javatimemodule(); module.addserializer(local_datetime_serializer); return new objectmapper() .setserializationinclusion(jsoninclude.include.non_null) .registermodule(module);}当我们想完全控制序列化过程而不想允许外部配置时,我们应该使用这种方法。
2.jackson2objectmapperbuilder另一种干净的方法是定义一个jackson2objectmapperbuilderbean。
实际上,spring boot在构建objectmapper时默认使用这个构建器,并会自动拾取定义的构建器。
@beanpublic jackson2objectmapperbuilder jackson2objectmapperbuilder() { return new jackson2objectmapperbuilder().serializers(local_datetime_serializer) .serializationinclusion(jsoninclude.include.non_null);}它将默认配置两个选项。
禁用mapperfeature.default_view_inclusion禁用deserializationfeature.fail_on_unknown_properties。根据jackson2objectmapperbuilder 文档,如果classpath上有一些模块,它也会注册这些模块。
jackson-datatype-jdk8:支持其他java 8类型,如optionaljackson-datatype-jsr310:支持java 8 date and time api类型jackson-datatype-joda:支持joda-time类型jackson-module-kotlin:支持kotlin类和数据类这种方法的优点是,jackson2objectmapperbuilder提供了一种简单而直观的方法来构建objectmapper。
3.mappingjackson2httpmessageconverter的方法我们可以直接定义一个类型为mappingjackson2httpmessageconverter的bean,spring boot会自动使用它。
@beanpublic mappingjackson2httpmessageconverter mappingjackson2httpmessageconverter() { jackson2objectmapperbuilder builder = new jackson2objectmapperbuilder().serializers(local_datetime_serializer) .serializationinclusion(jsoninclude.include.non_null); return new mappingjackson2httpmessageconverter(builder.build());}测试配置为了测试我们的配置,我们将使用testresttemplate并将对象序列化为string。
通过这种方式,我们可以验证我们的coffee对象在序列化时没有null值,并且具有自定义的日期格式。
@testpublic void whengetcoffee_thenserializedwithdateandnonnull() { string formatteddate = datetimeformatter.ofpattern(coffeeconstants.datetimeformat).format(fixed_date); string brand = javazza; string url = /coffee?brand= + brand; string response = resttemplate.getforobject(url, string.class); assertthat(response).isequalto({brand: + brand + ,date: + formatteddate + });}总结在这篇文章中,我们看了使用spring boot时配置json序列化选项的几种方法。
我们看到了两种不同的方法:配置默认选项或重写默认配置。
苹果新M1笔记本优于采用x86处理器的笔记本
动力电池质量参差不齐 工艺积累还需提升!
土壤肥料养分速测仪的用途有哪些,它有哪些优势
单片机解密失败的原因
恒大法拉第未来中国总部正式落地,规划明年一季度正式量产FF91
Spring Boot时配置JSON序列化选项的几种方法
虚拟仪器与虚拟试验技术简介
E-Band微波通信系统的应用及发展趋势
恩智浦重组领导团队 新任总裁Kurt Sievers将全面负责公司业务
威旺M204米5车长,3.68万起,还搭配1.5L 116马力的发动机
化学蚀刻的铜-ETP铜的实验分析
智能家居市场持续增长,本地化面临挑战需解决
ADMP421 低成本、低功率、数字输出的MEMS麦克风
LTC3260反相电荷泵DC/DC转换器的电源效率与噪声解决方案
samba权限控制
串联低压电容器组的放电电阻的方法
KEILC中.ASM文的导入和硬件仿真
全面概述GNSS高精度天线发展
汉威科技系列产品和解决方案赋能河南辖区资本市场更好发展
各种“*LED”彩电如何选?