幽灵成员问题的解决
前言
这是一个很令人无语的问题 在最近写代码时 发现一个问题
就是有时候在测试接口的时候 发现返回结果中出现了一些本不该出现的字段
甚至有时候还报错 信息如下
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注解可以让序列化器不对被此注解标注的方法或字段 因此加上此注解 可以解决这个问题
标签:跟进,SpringBoot,JSON,注解,序列化,方法,我们,类中 From: https://blog.csdn.net/m0_73918768/article/details/141824694