1.简述

2.返回为空的场景及其处理方案

2.1返回空对象或是空集合处理方案
     2.2对于返回data为集合类型,data中有对象为空的处理方案
         2.2.1更改序列化规则(三种方式)
         2.2.2指定空对象上添加注解

1.简述

springMVC返回前端数据格式应该想到HttpMessageConverter,简单来讲就是将http请求的请求内容和响应内容转化为对应格式.常见的http消息转化器有很多,现在大部分前后端数据通用格式为json,和json处理相关内的消息转化器是 MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;具体实现方式本文以 jackson进行说明,也是springMVC默认支持的处理json的方式.里面涉及几个类(下面处理会用到简单提一下):
    ObjectMapper,支持json格式信息读取;
    SerializationFeature:序列化规定的特性或是叫做规则更容易理解,不同规则会有相应的处理.
案例场景用到的响应封装参数:

public class ResultVo<T>  {private int code;// 是否成功标识.true表示成功,false表示失败private boolean success;// 操作成功时需要响应给客户端的响应数据private String msg;private T data;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date time;
// 省略get/set}

以下所有的返回信息均以data为目标进行处理

2.返回为空的场景及其处理方案
2.1返回空对象或是空集合处理方案

直接new HashMap<>()或是ArrayList<>(),适用于前端接仅接收一个空对象或是空集合场景.
相关代码如下:

@RequestMapping("/test")
@RestController
public class TestJsonkon {@GetMapping("/test")public ResultVo commonDdos(){return ResultVoUtil.success(new HashMap<>());}}

返回信息:

2.2对于返回data为集合类型,data中有对象为空的处理方案

这里创建两个对象,业务场景是要求返回的集合中有数据的要返回具体的数据信息,没有数据的要返回空对象.不理解业务场景没关系,可以直接关注空对象CommonDto2 即可.
前后端返回协议:

相关代码:
公共父类

public class CommonDdo  {}

返回子对象1

public class CommonDto1 extends CommonDdo {private String name;private int age;// 省略get/set
}

返回子对象2

public class CommonDto2 extends CommonDdo {}

测试代码:

@RequestMapping("/test")
@RestController
public class TestJsonkon {@GetMapping("/test")public ResultVo<ArrayList<CommonDdo>> commonDdos(){ArrayList<CommonDdo> commonDdos = new ArrayList<>();commonDdos.add(new CommonDto1("jack",18));commonDdos.add(new CommonDto2());commonDdos.add(new CommonDto2());return ResultVoUtil.success(commonDdos);}

进行测试发现:

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.chenghao.program.chenghaoprogram.jacksonHandle.CommonDto2]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.chenghao.program.chenghaoprogram.jacksonHandle.CommonDto2 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.chenghao.program.chenghaoprogram.interceptorHanle.ResultVo["data"]->java.util.ArrayList[1])at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:460) ~[spring-web-5.3.8.jar:5.3.8]// 省略部分异常...
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.chenghao.program.chenghaoprogram.jacksonHandle.CommonDto2 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.chenghao.program.chenghaoprogram.interceptorHanle.ResultVo["data"]->java.util.ArrayList[1])at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.12.3.jar:2.12.3]at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) ~[jackson-databind-2.12.3.jar:2.12.3]at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) ~[jackson-databind-2.12.3.jar:2.12.3]at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.12.3.jar:2.12.3]at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.12.3.jar:2.12.3]// 省略部分异常... 48 common frames omitted

最根本的异常信息:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.chenghao.program.chenghaoprogram.jacksonHandle.CommonDto2 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.chenghao.program.chenghaoprogram.interceptorHanle.ResultVo["data"]->java.util.ArrayList[1])
关键原因分析:SerializationFeature.FAIL_ON_EMPTY_BEANS,这是序列化规则中的一种,具体实现:

/**确定在找不到类型的访问器时会发生什么的功能(并且没有注释表明它是要序列化的)。如果启用(默认),则抛出异常以指示这些为不可序列化的类型;如果禁用,它们将被序列化为空对象,即没有任何属性。
请注意,此功能仅对那些没有任何可识别注释(如@JsonSerialize)的“空”bean 起作用的空类型:具有注释的那些不会导致抛出异常。默认情况下启用该功能。*/
FAIL_ON_EMPTY_BEANS(true),

也就是说对于默认空对象,序列化特性(规则)中是不支持序列化,代码中体现就是抛出异常.解决问题的方式有两种,更改枚举属性为false;另一中是按照注释上所讲,在指定对象上添加可识别’'空对象"的注解.

2.2.1更改序列化规则(三种方式)

1.通过自定义创建objectMapper,设置FAIL_ON_EMPTY_BEANS,相当于是覆盖默认配置.

   @Beanpublic ObjectMapper getObjectMapper(){ObjectMapper objectMapper = new ObjectMapper();        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);return objectMapper;}

2.通过Jackson2ObjectMapperFactoryBean设置

@Bean
public Jackson2ObjectMapperFactoryBean getJackson2ObjectMapperFactoryBean(){Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();jackson2ObjectMapperFactoryBean.setFailOnEmptyBeans(false);return jackson2ObjectMapperFactoryBean;
}

3.通过配置文件

spring:jackson:serialization:FAIL_ON_EMPTY_BEANS: false
2.2.2指定空对象上添加注解

自定义定义空对象类上添加注解:@JsonInclude(JsonInclude.Include.NON_EMPTY)
    该注解可以作用于类上表示为空对象对象时不参与序列化.平常常用的方式是作用于实体类字段属性上,当为空时不返回前端数据.
    以上处理均自测完成,如有问题欢迎评论区留言讨论!

springboot中返回前端空对象或空集合处理实现相关推荐

  1. 小程序判断一个对象是否为空 length不为0的空对象(空集合list)

    小程序判断一个对象是否为空 length不为0的空对象(空集合list) 集合为空但list的length不为0反而为1:使用list.isEmpty 或者 list.size都返回undefined ...

  2. “空对象 {}” 与 “空数组 []” 的相加问题(详解)

    本文旨在让读者能更加清晰地了解 "空对象 {}" 与 "空数组 ()" 相加(eg:"[] + []" ."[] + {}&quo ...

  3. js 判断是否为空对象、空数组

    当需要判断参数是否为空时,总希望 js 能够提供原生的判断方法,可惜并没有,只能自己封装了. 1 function isEmpty(obj) { 1 // 检验 undefined 和 null 1 ...

  4. SpringMvc中返回json时对象属性为空也要返回key

    场景: 最近在写接口时候,正常使用@RestController返回json串,发现当返回的对象里的属性值为空字符串或者null时候,json返回里就会自动去除这个key,啥意思呢?举个"栗 ...

  5. SpringBoot 直接返回 Json格式对象(报错:返回对象为空{})

    文章目录 1 需求描述 2 代码展示 3 原因分析 4 解决方案 5 效果展示 6 结束语 1 需求描述 我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个Use ...

  6. Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static...

    package com.swift; //使用无参构造方法自动生成对象,序号不断自增 public class Person {private static int count; //如果在定义类时, ...

  7. JavaScript判断对象是否为空对象或空数组

    1. 判断一个变量是对象还是数组 首先判断一个变量是对象还是数组,不能使用typeof来判断,因为不管是对象还是数组,使用typeof得到的都是"object". 可以使用Obje ...

  8. java内部类外部类_Java内部类:如何在内部类中返回外部类对象

    Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...

  9. Springboot中手动new的对象无法注入交给Spring容器管理的原因及解决办法

    Springboot中Bean的注入 我们都知道,Springboot可以使用方法级别注解(@Bean)和类级别注解(@Controller.@Component.@Service等)加包扫描的方式注 ...

最新文章

  1. 这五款Python工具都是最常用的,尤其是第三种,初学者必须掌握的
  2. 学习canvas 过程中的几点总结
  3. HDU 2147 kiki's game
  4. 上周热点回顾(9.7-9.13)
  5. 在deepin系统中制作桌面快捷方式
  6. 数据库-优化-pt-kill-授权-数据
  7. C#中的ForEach
  8. POJ 2255 Tree Recovery(已知前序中序,求后序)
  9. 自从阿里拿下 Flink 以后, 你还不懂 Flink 就 out 了
  10. 2022机修钳工(中级)特种作业证考试题库模拟考试平台操作
  11. msm8937+android7.1.1显示驱动解决显示残影问题
  12. Unity PlayerSetting设置
  13. uniapp读取和写入文件
  14. http://blog.csdn.net/lnb333666/article/details/8546497
  15. 如何查看计算机的网络网址,怎么查看电脑IP地址_如何查看电脑IP地址?-192路由网...
  16. 连接器E-mark认证要准备什么资料?
  17. 使用python计算最大回撤
  18. JavaBean和JavaBeans
  19. 【前端3分钟】写一个数字翻牌器
  20. 主打拍照功能 nubia Z5 mini正式发布

热门文章

  1. 2021安徽舒城中学高考成绩查询,舒城:乘胜前进!舒中吹响2021年高考集结号!...
  2. Linux设备管理: kobject、kset、ktype分析
  3. 几种常见反弹shell汇总
  4. 计算机网络应用教程吴小钧,计算机网络应用教程
  5. 字体图标数字字体的引入和使用
  6. C++声明、定义、类的定义、头文件作用、头文件重复引用
  7. OpenJudge1.3 答案
  8. 诺基亚微软软件测试,诺基亚被砍WinRT平板Lumia 2020评测:设计优秀,运行流畅
  9. python 正则表达式判断_正则表达式教程python | Python如何判断正则表达式是否匹配成功...
  10. assert函数--判断表达式是否正确