首页 > 其他分享 >【SpringBoot实用小知识】JSON序列化返回结果时出现的幽灵成员

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

时间:2024-09-07 20:21:25浏览次数:12  
标签:跟进 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注解可以让序列化器不对被此注解标注的方法或字段 因此加上此注解 可以解决这个问题

标签:跟进,SpringBoot,JSON,注解,序列化,方法,我们,类中
From: https://blog.csdn.net/m0_73918768/article/details/141824694

相关文章

  • springboot+vue英语四六级单词学习系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景在全球化日益加深的今天,英语作为国际通用语言的重要性不言而喻。对于广大中国学生来说,英语四六级考试不仅是衡量其英语水平的重要标尺,也是升学、就业不可或缺的敲门砖。然而,词汇作为语言学习的基础,往往是考生们备考路上的最大障碍。传......
  • springboot+vue水果销售系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着现代科技的飞速发展和消费者购物习惯的不断变化,传统水果销售模式正面临着前所未有的挑战与机遇。传统市场受限于地理位置、信息不对称及库存管理不善等问题,难以满足消费者日益增长的多元化、便捷化需求。与此同时,电子商务的兴起为......
  • springboot+vue乡村信息化管理系统的设计与实现【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,信息化已成为推动社会进步和治理现代化的重要力量。在乡村振兴战略的大背景下,乡村信息化管理系统的建设显得尤为重要。传统乡村管理模式面临着信息孤岛、效率低下、资源分配不均等问题,严重制约了乡村治理的现代......
  • A163-Springboot Vue Mysql校园社团信息管理
    介绍SpringbootVueMysql校园社团信息管理(毕业论文10000字以上,共29页,程序代码,MySQL数据库)【运行环境】IDEA,JDK1.8,Mysql,Node,Vue【技术栈】Java,SpringBoot,Jquery,Layui,MYSQL,HTML,CSS,JAVASCRIPT,Ajax......
  • A162-基于springboot vue的医护人员排班系统
    (======查看博主个人介绍,源码不易,有偿获取,联系方式-个人简介========)IdeaJDK1.8MySQL Node后台地址  http://localhost:8080/springbootjf5zc/admin/dist/index.html前台地址  http://localhost:8080/springbootjf5zc/front/index.html管理员: admin      12......
  • 【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)
    本文项目编号T018,文末自助获取源码\color{red}{T018,文末自助获取源码}......
  • SpringBoot集成WebSocket实现后端向前端推送数据
    SpringBoot集成WebSocket实现后端向前端推送数据这里最好了解一定websocket参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications在此之前可以了解一下【轮询(Polling)、长轮询(LongPolling)、服务器发送事件(Server......
  • springboot返回结果包装统一返回格式
     统一返回结果拦截处理类importcom.itcoder.test.utils.JsonUtils;importcom.sun.istack.internal.NotNull;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.core.MethodParameter;importor......
  • labelme标注的大图用sahi切成小图和小json
    1.去除labelme标注中只有1或2个点的轮廓指有些标注错误的只有1个点或2个点的轮廓不能转化为polygon点击查看代码importcv2importnumpyasnpimportjsonimportosdefremove_specific_labels(json_file):#读取JSON文件withopen(json_file,'rb+')asf:......
  • springboot流浪天使乐园管理系统
    基于springboot+vue实现的流浪天使乐园管理系统(源码+L文+ppt)4-039第4章系统设计   4.1总体功能设计一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使用者只能对流浪动物提供查阅......