springboot配置Jackson返回统一默认值的实现示例

 更新时间:2021年07月29日 11:42:08   作者:阿豪_mike  
在项目开发中,我们返回的数据或者对象没有的时候一般直接返回的null,那么如何返回统一默认值,感兴趣的可以了解一下

在项目开发中,我们返回的数据或者对象没有的时候一般直接返回的null

有数据时的返回值

{
 "flag": true,
 "code": "10000",
 "msg": "成功!",
 "data": {
  "id": 32,
  "templateType": 1,
  "templateName": "我的测试模板1",
  "freightName": "我的测试标题1",
  "listArea": [
   {
    "id": 968,
    "templateId": 32,
    "freightPrice": 15,
   }
  ],
  "templateDescEntity": {
   "id": 1
   "name": "xxx"
  }
 }
}

没有数据时的返回值

{
 "flag": true,
 "code": "10000",
 "msg": "成功!",
 "data": {
  "id": 32,
  "templateType": 1,
  "templateName": null,
  "freightName": null,
  "listArea": null,
  "templateDescEntity": null
 }
}

这种情况下数据返回给前端,前端需要做大量的空值判断
如前端调使用属性data.templateDescEntity.id的时候就会直接报异常
此时我们可以使用返回值统一处理,配置如下

pom.xml添加

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.5</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

java类添加配置

package com.ys.mall.core.product.config;

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;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 数据返回给前端时,设置null值默认为""
 *
 * @author cgh
 * @date 2020/12/14 10:35
 */
@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 {
                String fieldName = jsonGenerator.getOutputContext().getCurrentName();
                try {
                    //反射获取字段类型
                    Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
                    if (CharSequence.class.isAssignableFrom(field.getType())) {
                        //字符串型空值""
                        jsonGenerator.writeString("");
                        return;
                    } else if (Collection.class.isAssignableFrom(field.getType())) {
                        //列表型空值返回[]
                        jsonGenerator.writeStartArray();
                        jsonGenerator.writeEndArray();
                        return;
                    } else if (Map.class.isAssignableFrom(field.getType())) {
                        //map型空值 或者 bean对象 返回{}
                        jsonGenerator.writeStartObject();
                        jsonGenerator.writeEndObject();
                        return;
                    }
                } catch (NoSuchFieldException ignored) {
                }

                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

添加空值统一处理后的返回值

{
 "flag": true,
 "code": "10000",
 "msg": "成功!",
 "data": {
  "id": 32,
  "templateType": 1,
  "templateName": "",
  "freightName": "",
  "listArea": [],
  "templateDescEntity": {}
 }
}

到此这篇关于springboot配置Jackson返回统一默认值的实现示例的文章就介绍到这了,更多相关springboot Jackson返回统一默认值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java在Word中插入上标和下标的实现方法

    Java在Word中插入上标和下标的实现方法

    在某些情况下,你可能需要在Microsoft Word中插入上标和下标。例如,当你正在创建一个涉及科学公式的学术文件时,在这篇文章中,你将学习如何使用Spire.Doc for Java库在Word文档中插入上标和下标,需要的朋友可以参考下
    2022-10-10
  • Java程序启动时初始化数据的四种方式

    Java程序启动时初始化数据的四种方式

    本文主要介绍了Java程序启动时初始化数据的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 详解WebSocket+spring示例demo(已使用sockJs库)

    详解WebSocket+spring示例demo(已使用sockJs库)

    本篇文章主要介绍了WebSocket spring示例demo(已使用sockJs库),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 浅谈Java线程Thread之interrupt中断解析

    浅谈Java线程Thread之interrupt中断解析

    这篇文章主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Mybatis Plus 中的LambdaQueryWrapper示例详解

    Mybatis Plus 中的LambdaQueryWrapper示例详解

    这篇文章主要介绍了Mybatis Plus 中的LambdaQueryWrapper,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • hystrix服务降级方法使用介绍

    hystrix服务降级方法使用介绍

    什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作
    2022-09-09
  • java中多线程的超详细介绍

    java中多线程的超详细介绍

    这篇文章主要给大家介绍了关于java中多线程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • RabbitMQ消息队列中多路复用Channel信道详解

    RabbitMQ消息队列中多路复用Channel信道详解

    这篇文章主要介绍了RabbitMQ消息队列中多路复用Channel信道详解,消息Message是指在应用间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象,需要的朋友可以参考下
    2023-08-08
  • Java之api网关断言及过滤器案例讲解

    Java之api网关断言及过滤器案例讲解

    这篇文章主要介绍了Java之api网关断言及过滤器案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot 多Profile使用与切换方式

    SpringBoot 多Profile使用与切换方式

    这篇文章主要介绍了SpringBoot 多Profile使用与切换方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论