当前位置: 首页 > article >正文

SpringBoot配置返回数据不存在null

一、引言

最近在做项目中遇到一个神奇的问题,在测试返回银行三级数据的时候有的项目中返回的数据中把null值的数据返回了,而有的时候就不存在null值数据,如下所示:

存在null值情况

不含null值情况

但是我们可以看一下返回的VO的数据结果如下:

import lombok.Data;

import java.util.List;

/*
 * @description 银行
 * @author 罗添煦
 * @create 2024-08-30 下午12:38
 */
@Data
public class BankEntity {
    private String bankName;
    private String bankCode;
    private List<BankEntity> children;
}

二、jackson

        因为上面的问题出现带着好奇心的我,就去搜索了大量的资料,发现在springboot中默认支持的序列化器是jackson,可能你没有听说过jackson这个序列化器,但是你应该在项目中使用过alibaba的序列化工具fastjson。

1、默认情况下,ObjectMapper 在序列化对象时,将实体所有的字段一 一序列化,无论这些字段是否有值,是否为 null。

2、如果实体的某个字段没有提供 getter 方法,则该字段不会被序列化。

3、Spring Boot Web 组件默认使用 Jackson 进行对象的序列化与反序列化,即页面传入的参数,会自动反序列化为后台对象,后台传给前端的对象,也会序列化后输出。所以需要注意返回给页面的对象默认不能使用 Jackson 以外的 Json 库序列化,比如返回一个 Gson 的 JsonObject 给前端,则会报错,因为显然 Jackson 序列化时会失败。

4、Jackson 提供三种不同的方法来操作 JSON:

1)流式API - 使用 Stream(流) 的方式对 Json 的每一个组成部分进行最细粒度的控制,JsonParser 读取数据,JsonGenerator 写入数据。

2)树模型 - 将 JSON 文件在内存里以树的形式表示,通过 JsonNode 处理单个Json节点,类似于 XML 的 DOM 解析器。(常用)

3)databind 模块 - ObjectMapper 读/写 JSON 是 POJO 序列化与反序列化 Json 最方便的方式。(常用)

但是这个地方我们就不过多的去介绍使用Jackson我们还是来看一下是如何解决响应数据中不含null值这个问题的。 

三、配置jackson

处理方法1、返回json中的null字段-不显示 

配置文件添加 spring.jackson.default-property-inclusion=non_null 配置

处理方法2、返回json中的null字段-转为空字符串

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
import java.io.IOException;
 
/**
 * 处理 jackson 返回的null值
 * 返回json中的null值转为空字符串
 */
@Configuration
public class JacksonConfig {
 
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

但是这种方式只是把返回null的数据返回成为了空字符串,和我们需要的看不到参数还是有差距的。

 jackson其他配置,我们可以配置Jackson返回时间的类型。

我们可以看一下springboot默认帮我们配置的时间类型的返回数据是什么格式。

在不指定任何特殊配置的情况下,返回的 date 类型的字段会自动转成 UTC 格式字符串,形如 "2024-09-02T01:51:24.091+00:00"

但是我们想要变成yyyy-MM-dd HH:mm:ss这种格式的话我们就可以在字段上添加注解

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

 经过配置以后返回数据如下所示:

 


http://www.kler.cn/news/292913.html

相关文章:

  • JUnit 5和Mockito进行单元测试!
  • Redis配置
  • 计算机毕业设计推荐-基于python的电子图书馆数据可视化分析
  • Tensorflow实现深度学习8:猫狗识别
  • c++中析构函数是否一定要为虚函数
  • Markdown全兼容,MarkText打造专业文档新体验
  • 【数学建模】国赛论文模型的建立与求解写作指南
  • 前端希望Quasar
  • C# 迭代器
  • 可解释人工智能(XAI)领域的全面概述
  • 【Spring Boot 3】【Web】配置HTTPS
  • Aloudata CAN 发布:真正实现企业指标的管理、研发与消费一体化
  • Java 基础八股文
  • EmguCV学习笔记 VB.Net 9.3 移动检测类
  • 【补-网络安全】日常运维(二)终端端口占用排查
  • 10--基于kubernetes的redis-cluster部署
  • nvm详细安装使用教程和详细命令,以及提示” ‘nvm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件“处理办法
  • 4、Django Admin对自定义的计算字段进行排序
  • Verilog和Matlab实现RGB888互转YUV444
  • go--闭包
  • 阿里“整改摘帽”,马云的“百年企业”愿景再出发
  • 什么是URL Slug及其如何影响SEO?
  • 中国科学院近代物理研究所博士招生目录
  • python进阶篇-day07-进程与线程
  • [米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-24 TPG图像测试数据发生器设计
  • SD-WAN,是干嘛的?
  • PS插件DR5至臻高级版下载安装教程Photoshop美颜美白牙齿磨皮使用插件百度网盘分享
  • 【 OpenHarmony 4.1 Launcher 源码解析 】-- 初体验
  • 推荐字体网站
  • Openwrt 安装 AX210 无线网卡