【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例

news2024/11/26 1:12:36

Spring自动定义Jackson转换Null得方法

  • 背景
    • MessageConverter
  • 使用Jackson原生方式处理空字段(次重点方案)
      • ObjectMapper的配置选项
        • 通过使用注解的方式
  • MappingJackson2HttpMessageConverter(重点方案)
    • 创建MappingJackson2HttpMessageConverter
    • XML配置
    • Java配置
    • MappingJackson2HttpMessageConverter整合ObjectMapper的配置
      • XML配置
      • JavaConfig配置
    • 自定义的null处理类注解
      • 方案1:使用注解
      • 方案1:序列化器
  • 总结一下

背景

在Spring MVC中配置JSON转换器时,当需要全局控制将某些JSON返回值的key转换为一些默认值时,可以通过实现一个自定义的序列化器(Serializer)来实现这个功能。现在,我们来深入了解Spring MVC的整体处理流程,以确定在哪个步骤进行实现和调整。
在这里插入图片描述
我们先来总结数量一下整个流程:

  1. 用户发送请求,由Spring的前端控制Servlet DispatcherServlet捕获。
  2. DispatcherServlet解析请求URL,并根据URI获取与之相关的Handler和拦截器配置。
  3. DispatcherServlet选择合适的HandlerAdapter来执行Handler(Controller)。在此过程中,也会执行拦截器的preHandler方法。
  4. 提取请求中的模型数据(通过MessageConverter对于入参进行转换)并填充Handler的参数,开始执行Handler。
  5. 执行完成后,返回一个包含Model和View信息的ModelAndView对象。
  6. 根据ModelAndView选择合适的ViewResolver,将其返回给DispatcherServlet。
  7. ViewResolver将Model和View结合起来,进行视图渲染。
  8. 最终将渲染结果返回给客户端(响应的数据转换则通过MessageConverter完成)

MessageConverter

对于JSON转换,涉及到MessageConverter的工作,通过在Spring MVC处理流程中的适当步骤实现自定义序列化器,我们能够全局控制JSON返回值的key,确保它们在需要时转换为指定的默认值。这种方式提供了灵活性和可定制性,使开发者能够更好地适应不同的业务需求。
在这里插入图片描述
MappingJackson2HttpMessageConverter是Spring框架中提供的一个HTTP消息转换器,用于在Spring MVC中进行JSON与Java对象之间的转换。它基于Jackson库,利用Jackson提供的功能进行JSON的序列化和反序列化,接下来我们就针对于它进行实现。

使用Jackson原生方式处理空字段(次重点方案)

当返回字段为null时需要进行处理,可以通过配置ObjectMapper来选择合适的处理方式。以下是几种常见的处理方式及其配置方式:
在这里插入图片描述

ObjectMapper的配置选项

使得ObjectMapper在将Java对象转换为JSON字符串时,仅包含字段值不为null的属性。对于为null的属性,它们将被忽略并不会显示在生成的JSON中。

// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 配置ObjectMapper处理返回字段为null的方式
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);  // 字段均包含在结果JSON中,无论是否为null
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);  // 字段的值不为null时,才会包含在结果JSON中
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);  // 字段的值与其默认值不相等时,才会包含在结果JSON中
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);  // 字段的值不为null且不为空时,才会包含结果JSON中
// 使用配置好的ObjectMapper进行对象转换
YourObject yourObject = ...;  // 要转换的对象
String json = objectMapper.writeValueAsString(yourObject);  // 将对象转换为JSON字符串
通过使用注解的方式

使用注解可以更精确地控制每个类或属性的处理方式。

@JsonInclude(JsonInclude.Include.ALWAYS)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

通过调用setSerializationInclusion方法并传入相应的JsonInclude.Include枚举值,可以配置ObjectMapper处理返回字段为null时的方式。可以根据具体需求选择适合的处理方式。

MappingJackson2HttpMessageConverter(重点方案)

对于SpringMVC,我们会采用MappingJackson2HttpMessageConverter可以将Java对象转换为JSON格式的响应体,并将JSON格式的请求体转换为对应的Java对象。它支持多种媒体类型,如application/json、text/json等。

创建MappingJackson2HttpMessageConverter

在Spring MVC中配置MappingJackson2HttpMessageConverter可以通过以下两种方式:Xml配置和Javaconfig配置

XML配置

下面展示了如何在applicationContext.xml文件中进行XML配置来实现对MappingJackson2HttpMessageConverter 的定义,并通过元素设置了supportedMediaTypes属性:

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes">
        <list>
            <value>application/json</value>
            <!-- 可以添加其他支持的媒体类型 -->
        </list>
    </property>
    <!-- 其他配置属性 -->
</bean>

在上述配置中,我们使用元素定义了MappingJackson2HttpMessageConverter的bean,并指定了其类名org.springframework.http.converter.json.MappingJackson2HttpMessageConverter,通过元素来设置supportedMediaTypes属性。通过元素来指定一个媒体类型列表,其中每个类型由元素表示。在示例中,我们设置了一个值为application/json的媒体类型。这样就可以将Java对象转换为JSON,并以指定的媒体类型返回给客户端。

Java配置

在Java配置中,我们可以使用@Bean注解创建MappingJackson2HttpMessageConverter的bean,并在方法中进行相同的配置。此外,我们还可以使用Charset.forName(“UTF-8”)来替代java.nio.charset.StandardCharsets.UTF_8来创建MediaType。具体示例如下:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 配置媒体类型
        converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON));
        // 其他配置...
        converters.add(converter);
    }
}

MappingJackson2HttpMessageConverter整合ObjectMapper的配置

在上面我们定义了一个 MappingJackson2HttpMessageConverter bean,并设置了 supportedMediaTypes 属性为"application/json",以支持在 Spring MVC 中将 Java 对象转换为 JSON 并返回给客户端。

在这个基础知识,我们加入了最早介绍的 ObjectMapper bean,并设置其 serializationInclusion 属性为 NON_NULL,这将使得序列化时排除掉值为null的字段。

XML配置

<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes">
        <list>
            <value>application/json;charset=UTF-8</value>
        </list>
    </property>
    <property name="objectMapper">
        <bean class="com.fasterxml.jackson.databind.ObjectMapper">
            <property name="serializationInclusion">
                <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
            </property>
        </bean>
    </property>
</bean>

JavaConfig配置

通过mappingJacksonHttpMessageConverter方法创建了一个MappingJackson2HttpMessageConverter的实例,并设置了支持的媒体类型为application/json;charset=UTF-8。

@Configuration
public class WebConfig {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 配置支持的媒体类型为application/json;charset=UTF-8
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON_UTF8));
        // 配置ObjectMapper,设置serializationInclusion为NON_NULL
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        converter.setObjectMapper(objectMapper);
        return converter;
    }
}

创建了一个ObjectMapper实例,并配置了其serializationInclusion为NON_NULL,然后将该ObjectMapper设置到MappingJackson2HttpMessageConverter中。

自定义的null处理类注解

自定义的 DetfaultNullJsonSerializer,它是一个继承自 JsonSerializer<Object> 的序列化器,用于处理值为null的情况。在 serialize 方法中,我们将使用自定义的 JsonNullDef 对象来替代值为null的字段进行序列化。


public class DetfaultNullJsonSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeObject(new JsonNullDef());
    }
}

class JsonNullDef {
    private List<String> def = new ArrayList<>();
    public List<String> getDef() {
        return def;
    }
    public void setDef(List<String> def) {
        this.def = def;
    }
}

因此,我们可以通过自定义ObjectMapper和注册自定义的序列化器来在转换过程中添加我们需要的控制逻辑。上述的示例代码展示了如何在WebConfig配置类中实现这一点,通过注册自定义的序列化器实现对特定字段null值的转换为默认值。

JsonNullDef 类中,我们定义了一个包含一个名为 def 的列表字段,用于存储默认值。通过这个自定义的null处理类,我们可以在值为null的字段处提供一个默认值,从而避免在序列化时出现null值。

方案1:使用注解

在需要使用自定义序列化器的类或对象上,通过注解或方法来指定使用 DetfaultNullJsonSerializer,例如在 MyData 类中使用注解:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class MyData {
    @JsonSerialize(nullsUsing = DetfaultNullJsonSerializer.class)
    private String name;
    @JsonSerialize(nullsUsing = DetfaultNullJsonSerializer.class)
    private String description;
    // 其他字段和方法...
   // 构造函数、getter和setter方法...
}

除了直接用到了注解上,还可以定义到序列化器上面,方便控制和整合到MappingJackson2HttpMessageConverter中。

方案1:序列化器

创建一个自定义的 ObjectMapper 并注册自定义的序列化器:


@Configuration
public class WebConfig {
	public ObjectMapper objectMapper() {
	        ObjectMapper objectMapper = new ObjectMapper();
	        SimpleModule module = new SimpleModule();
	        module.addSerializer(Object.class, new DetfaultNullJsonSerializer());
	        objectMapper.registerModule(module);
	        return objectMapper;
	}
    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 配置支持的媒体类型为application/json;charset=UTF-8
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON_UTF8));
        converter.setObjectMapper(objectMapper());
        return converter;
    }
}

总结一下

用自定义的DetfaultNullJsonSerializer,在类或属性上使用@JsonSerialize(nullsUsing = DetfaultNullJsonSerializer.class)注解指定使用该序列化器,以及在配置类中创建并注册自定义的ObjectMapper,将自定义序列化器与ObjectMapper关联。在代码中使用该ObjectMapper实现对象的序列化和反序列化操作。这样,你就可以灵活地控制值为null的字段的处理方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习在工地安全帽识别技术的应用与展望

当我们谈论“工地安全帽识别”时&#xff0c;实际上我们在探讨的是如何利用深度学习图像识别技术来提高建筑工地的安全性。这一技术的应用可以显著提高工地安全管理的效率和有效性&#xff0c;是现代建筑工程管理中不可或缺的一部分。以测评的北京富维图像的工地安全帽识别为例…

【管理篇 / 登录】❀ 06. macOS下使用USB配置线登录 ❀ FortiGate 防火墙

【简介】飞塔防火墙上都会配有CONSOLE接口&#xff0c;包装里都会配置一根USB配置线&#xff0c;通过这个接口和这根线&#xff0c;我们可以用命令的方式登录飞塔防火墙。随着苹果电脑的普及&#xff0c;我们来学习如何在macOS中使用USB配置线登录飞塔防火墙。 早期飞塔防火墙包…

【数据分享】2023年我国省市县三级的商务住宅数量(4类设施/Excel/Shp格式)

产业园区、住宅区、楼宇等商务住宅的数量是一个城市基础设施完善程度的重要体现&#xff0c;一个城市商务住宅的种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的城市化水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、各区县三个层级的商…

静态网页设计——网上书店(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;网上式的书店。是一种高质量&#xff0c;更快捷&#xff0c;更方便的购书方式。网上书店不仅可用于图书的在线销售…

使用 Maven 的 dependencyManagement 管理项目依赖项

使用 Maven 的 dependencyManagement 管理项目依赖项 介绍 在开发 Java 项目时&#xff0c;管理和协调依赖项的版本号是一项重要而繁琐的任务。 而 Maven 提供了 <dependencyManagement> 元素&#xff0c;用于定义项目中所有依赖项的版本。它允许您指定项目中每个依赖…

thinkadmin列表根据值判断男女显示和form选择select

{field: gs, title: 公司, align: left, minWidth: 140,templet

安全加固之weblogic屏蔽T3协议

一、前言 开放weblogic控制台的7001端口&#xff0c;默认会开启T3协议服务&#xff0c;T3协议则会触发的Weblogic Server WLS Core Components中存在反序列化漏洞&#xff0c;攻击者可以发送构造的恶意T3协议数据&#xff0c;获取目标服务器权限。 本文介绍通过控制T3协议的访问…

淘宝京东1688商品详情API接口,搜索商品列表接口

前言 在实际工作中&#xff0c;我们需要经常跟第三方平台打交道&#xff0c;可能会对接第三方平台API接口&#xff0c;或者提供API接口给第三方平台调用。 那么问题来了&#xff0c;如果设计一个优雅的API接口&#xff0c;能够满足&#xff1a;安全性、可重复调用、稳定性、好…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的掉线自动重连的技术背景通过PnP事件函数检查Baumer工业相机是否掉线在NEOAPI SDK里实现相机掉线重连方法&#xff1a;工业相机掉线重连测试演示图…

x-cmd-mod | zuz - 压缩或解压文件

目录 简介首次用户子命令x zuz zx zuz uzx zuz uzrx zuz ls 相关链接 简介 zuz 为 x-cmd 中的必用模块之一&#xff0c;提供压缩与解压文件的功能。 x z 就是调用 x zuz z&#xff0c;可将目标文件压缩根据后缀名成指定格式&#xff0c;x uz 则可以解压任何格式的压缩包 首次…

音乐制作软件Studio One mac有哪些特点

Studio One mac是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

将DOM结构转换成图片保存至本地或保存至剪切板

在新业务需求中&#xff0c;碰到这样一个场景&#xff0c;需要将后端返回的表格数据&#xff0c;保存至本地或者保存至剪切板&#xff0c;直接发送给用户使用。 1. 将内容转换成图片并保存至本地 1.1 交互效果 如图所示&#xff0c;想要点击复制按钮后&#xff0c;将下面这个…

simulink代码生成(六)——中断向量模块的配置

假如系统中存在多个中断&#xff0c;需要合理的配置中断的优先级与中断向量表&#xff1b;在代码生成中&#xff0c;要与中断向量表对应&#xff1b;中断相关的知识参照博客&#xff1a; DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…

x-cmd pkg | thefuck - 终端命令纠错工具

目录 简介首次用户功能特点规则和即时模式竞品和相关作品进一步阅读 简介 thefuck 是一个终端命令纠错工具&#xff0c;可以帮助您更正先前键入的错误命令。它能纠正绝大部分常见的命令错误&#xff0c;如命令拼写不对、输错命令等。 基本原理&#xff1a;获取您最近执行的一…

机器学习(三) -- 特征工程(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 三、特征…

基于PCA-WA(Principal Component Analysis-weight average)的图像融合方法 Matlab代码及示例

摘要&#xff1a; 高效地将多通道的图像数据压缩&#xff08;如高光谱、多光谱成像数据&#xff09;至较低的通道数&#xff0c;对提高深度学习&#xff08;DL&#xff09;模型的训练速度和预测至关重要。本文主要展示利用PCA降维结合weight-average的图像融合方法。文章主要参…

Vagrant安装虚拟机

Vagrant安装虚拟机 优点&#xff1a;操作简单方便 vagrant仓库提供已配置完成镜像系统&#xff0c;只需简单命令可迅速初始化运行虚拟机 一、安装virtualBox 官方网站&#xff1a;Oracle VM VirtualBox 如果虚拟机安装失败&#xff0c;可能计算机未开启CPU虚拟化 二、安装V…

md文件图片上传方案:Github+PicGo 搭建图床

文章目录 1. PicGo 下载2. 配置Github3. 配置PicGo4. PicGo集成Typora4.1 picGo监听端口设置 5. 测试 1. PicGo 下载 下载地址&#xff1a;https://molunerfinn.com/PicGo/ 尽量下载稳定版本 2. 配置Github 1. 创建一个新仓库&#xff0c;用于存放图片 2. 生成一个token&a…

不要告诉别人的passwd

文章目录 不要告诉别人的passwd修改或更新密码删除用户密码查看密码的状态更多信息 不要告诉别人的passwd passwd用于创建或者更新用户密码&#xff0c;是管理员必备的命令之一。 这个命令最终的实现是通过调用Linux-PAM 和Libuser API来实现的。 官方的定义为&#xff1a; …

简单工厂模式、工厂方法、抽象工厂模式

下面例子中鼠标&#xff0c;键盘&#xff0c;耳麦为产品&#xff0c;惠普&#xff0c;戴尔为工厂。 简单工厂模式 简单工厂模式不是 23 种里的一种&#xff0c;简而言之&#xff0c;就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂&#xff0c;专业生产鼠标&#xf…