springboot中返回前端空对象或空集合处理实现
1.简述
2.返回为空的场景及其处理方案
2.1返回空对象或是空集合处理方案
2.2对于返回data为集合类型,data中有对象为空的处理方案
2.2.1更改序列化规则(三种方式)
2.2.2指定空对象上添加注解
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为目标进行处理
直接new HashMap<>()或是ArrayList<>(),适用于前端接仅接收一个空对象或是空集合场景.
相关代码如下:
@RequestMapping("/test")
@RestController
public class TestJsonkon {@GetMapping("/test")public ResultVo commonDdos(){return ResultVoUtil.success(new HashMap<>());}}
返回信息:
这里创建两个对象,业务场景是要求返回的集合中有数据的要返回具体的数据信息,没有数据的要返回空对象.不理解业务场景没关系,可以直接关注空对象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;另一中是按照注释上所讲,在指定对象上添加可识别’'空对象"的注解.
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
自定义定义空对象类上添加注解:@JsonInclude(JsonInclude.Include.NON_EMPTY)
该注解可以作用于类上表示为空对象对象时不参与序列化.平常常用的方式是作用于实体类字段属性上,当为空时不返回前端数据.
以上处理均自测完成,如有问题欢迎评论区留言讨论!
springboot中返回前端空对象或空集合处理实现相关推荐
- 小程序判断一个对象是否为空 length不为0的空对象(空集合list)
小程序判断一个对象是否为空 length不为0的空对象(空集合list) 集合为空但list的length不为0反而为1:使用list.isEmpty 或者 list.size都返回undefined ...
- “空对象 {}” 与 “空数组 []” 的相加问题(详解)
本文旨在让读者能更加清晰地了解 "空对象 {}" 与 "空数组 ()" 相加(eg:"[] + []" ."[] + {}&quo ...
- js 判断是否为空对象、空数组
当需要判断参数是否为空时,总希望 js 能够提供原生的判断方法,可惜并没有,只能自己封装了. 1 function isEmpty(obj) { 1 // 检验 undefined 和 null 1 ...
- SpringMvc中返回json时对象属性为空也要返回key
场景: 最近在写接口时候,正常使用@RestController返回json串,发现当返回的对象里的属性值为空字符串或者null时候,json返回里就会自动去除这个key,啥意思呢?举个"栗 ...
- SpringBoot 直接返回 Json格式对象(报错:返回对象为空{})
文章目录 1 需求描述 2 代码展示 3 原因分析 4 解决方案 5 效果展示 6 结束语 1 需求描述 我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个Use ...
- Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static...
package com.swift; //使用无参构造方法自动生成对象,序号不断自增 public class Person {private static int count; //如果在定义类时, ...
- JavaScript判断对象是否为空对象或空数组
1. 判断一个变量是对象还是数组 首先判断一个变量是对象还是数组,不能使用typeof来判断,因为不管是对象还是数组,使用typeof得到的都是"object". 可以使用Obje ...
- java内部类外部类_Java内部类:如何在内部类中返回外部类对象
Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...
- Springboot中手动new的对象无法注入交给Spring容器管理的原因及解决办法
Springboot中Bean的注入 我们都知道,Springboot可以使用方法级别注解(@Bean)和类级别注解(@Controller.@Component.@Service等)加包扫描的方式注 ...
最新文章
- 这五款Python工具都是最常用的,尤其是第三种,初学者必须掌握的
- 学习canvas 过程中的几点总结
- HDU 2147 kiki's game
- 上周热点回顾(9.7-9.13)
- 在deepin系统中制作桌面快捷方式
- 数据库-优化-pt-kill-授权-数据
- C#中的ForEach
- POJ 2255 Tree Recovery(已知前序中序,求后序)
- 自从阿里拿下 Flink 以后, 你还不懂 Flink 就 out 了
- 2022机修钳工(中级)特种作业证考试题库模拟考试平台操作
- msm8937+android7.1.1显示驱动解决显示残影问题
- Unity PlayerSetting设置
- uniapp读取和写入文件
- http://blog.csdn.net/lnb333666/article/details/8546497
- 如何查看计算机的网络网址,怎么查看电脑IP地址_如何查看电脑IP地址?-192路由网...
- 连接器E-mark认证要准备什么资料?
- 使用python计算最大回撤
- JavaBean和JavaBeans
- 【前端3分钟】写一个数字翻牌器
- 主打拍照功能 nubia Z5 mini正式发布
热门文章
- 2021安徽舒城中学高考成绩查询,舒城:乘胜前进!舒中吹响2021年高考集结号!...
- Linux设备管理: kobject、kset、ktype分析
- 几种常见反弹shell汇总
- 计算机网络应用教程吴小钧,计算机网络应用教程
- 字体图标数字字体的引入和使用
- C++声明、定义、类的定义、头文件作用、头文件重复引用
- OpenJudge1.3 答案
- 诺基亚微软软件测试,诺基亚被砍WinRT平板Lumia 2020评测:设计优秀,运行流畅
- python 正则表达式判断_正则表达式教程python | Python如何判断正则表达式是否匹配成功...
- assert函数--判断表达式是否正确