【SpringBoot实用小知识】JSON序列化返回结果时出现的幽灵成员

前言

这是一个很令人无语的问题 在最近写代码时 发现一个问题
就是有时候在测试接口的时候 发现返回结果中出现了一些本不该出现的字段
甚至有时候还报错 信息如下

Writing [Result(msg=null, data=[CoderActivityConfig{version=1, signupPoint=10, activityConfigMapper=null}], e (truncated)...]
Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.fuys.coder.common.entity.Result["data"]->java.util.ArrayList[0]->org.fuys.coder.common.config.app.CoderActivityConfig["subConfigList"])]

刚看到这个问题时 必须承认的是 我真傻了
因为我不记得我设置过一个叫 subConfigList 的成员 无论是 CoderActivityConfig 抑或是 它的父类 BaseConfig 都不存在这个成员啊

debug过程

这部分不感兴趣的读者可以不看 直接跳到解决方式
经过层层Debug 终于发现问题所在 其他的诸如由于代理进入的类我们都跳过 我们直接看关键部分
首先进入第一个类 RequestResponseBodyMethodProcessor
这里的关键是打断点的方法
在这里插入图片描述
进入到其中 我们发现跳转到了 AbstractMessageConverterMethodProcessor 类中
重点看这一段方法执行
在这里插入图片描述
进入到write方法层层跟进 通过F7不断进入方法
最终我们到了 ** AbstractJackson2HttpMessageConverter** 类中
在这里插入图片描述
可以看到我们的Jackson用于序列化的objectMapper 跟进

在这里插入图片描述
看到序列化相关方法 跟进
在这里插入图片描述
这里由于是自定义类型 我们会走到最后一个序列化方法中
依然跟进 到 DefaultSerializerProvider 类中
在这里插入图片描述
跟进序列化相关方法 还是之前的步骤 这里我们可能会跟进很多步 省略部分 直接到关系到我们问题的序列化类 BeanSerializer
在这里插入图片描述
跟进断点方法 我们距离原因很近了 这里就是序列化成员的方法
来到 BeanSerializerBase
在这里插入图片描述
重点看这一段 这一段进行序列化操作 序列化我们的BaseConfig 我提供了一个getTest方法用于测试
进入到蓝色背景的方法中查看 到BeanPropertyWriter 类中
在这里插入图片描述
继续跟进 到序列化列表的类 IndexedListSerializer (如果不是列表 可能不是此类 但是序列化内容的操作应该大致相同)
在这里插入图片描述
跟进到serailizerContents 方法的下面片段
在这里插入图片描述
通过debug可以看到 通过getTest方法获取了test成员 可是如我之前所说 这是一个方法而非属性
继续跟进序列化相关方法 我们又来到了BeanSerializer类中
依然跟进断点方法
在这里插入图片描述
在这一段中 最终因为无法获取NullSerializer 对test设置值而直接抛出了异常 导致序列化失败
如果NullSerializer 存在 则会在返回结果中看到一个本不该存在的test字段
在这里插入图片描述
无论是哪种 结果都是我们不想看到的 因此我们需要解决它!

结论及解决方式

1.更改方法名称

既然是由于get的方法名称来进行的 我改名还不行吗?
将方法更改为其他名称 如select开头 即可避免

2.为方法加上@JsonIgnore注解

@JsonIgnore注解可以让序列化器不对被此注解标注的方法或字段 因此加上此注解 可以解决这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值