当前位置: 首页 > article >正文

踩坑日记-@Data注释的使用

前情提要

在编写一个访问数据库的很简单的代码

明明运行成功,但是就是不出现数据

[{},{},{},{},{},{},{},{},{}]

排查思路

其实一般遇到数据库的问题都是排查数据库是否登陆;数据库链接是否正确;mybatis的映射是否正常;诸如此类的问题,但是我这都运行成功,所以没有这些问题,排除这些原因

所以改输出代码

log.info("测试结果:{}", (awards));

发现此时有结果,只不过是一些地址,

这也说明他确确实实找到数据,但是数据没有办法表示出来,所以就在json

JSON使用

log.info("测试结果:{}", awards);

这种方式时,日志框架会调用awards对象的toString()方法来输出日志信息。

awards列表中的每个Award对象的toString()方法返回的是对象的内存地址表示,不是俺想要的信息。

(不过这也说明他确确实实找到数据,但是数据没有办法表示出来,这是重点希望!!)

log.info("测试结果:{}", JSON.toJSONString(awards));

这种方式时,将awards对象转换成了JSON字符串,这样就能以更可读的方式输出对象的内容JSON.toJSONString(awards)会遍历awards列表中的每个Award对象,将对象的属性转换成JSON格式的字符串,这样就能在日志中看到每个对象的实际内容,而不仅仅是内存地址。

总结来说,问题在于toString()方法的实现和JSON序列化的区别:

  1. toString()方法:默认情况下,Java对象的toString()方法返回的是类名@对象哈希码的十六进制表示,这通常用于调试,而不是展示对象的实际内容。

  2. JSON序列化:将对象转换成JSON字符串,可以展示对象内部的实际数据,这对于日志记录和调试是非常有用的,因为它能让你看到对象的实际状态。

所以为啥我用JSON输出的就是数据内容,但是为啥我是空的呀

这通常意味着 Award 对象中的属性没有被正确序列化

序列化

没有正确序列化的原因有这些,

  1. 属性为NullAward 对象的属性可能为 null,导致序列化后显示为空对象。

  2. Getter方法问题Award 类中的属性可能没有对应的公共getter方法,或者getter方法返回的是不可序列化的值。

  3. 序列化配置问题:使用的JSON序列化库(如FastJSON、Jackson等)可能需要特定的配置来正确处理对象序列化。

  4. 循环引用Award 对象中可能存在指向自身的引用或者相互引用,导致序列化库无法正确处理。

  5. 忽略序列化Award 类或其属性可能被注解标记为在序列化时忽略。

  6. 属性类型不匹配Award 类中的属性类型可能与JSON序列化库期望的类型不匹配。

看到第二点我突然意识到我创建实体类的时候确实没有加上构造函数,所以人间从数据库找到数据了,但是没有办法转换为实体类,因为没有构造函数,啊啊啊啊!!!

为啥没有加上构造函数,因为我忽略@Data注释有构造函数的作用,我以为他是用来表示数据形式的,我只需要引入包就行了,为啥还加这个注释然后就给这个注释删掉了

啊啊啊啊啊啊啊啊啊啊,愚蠢的错误,错误的编码习惯,不要想当然,不懂的一定要查,不差这一会,一出现bug更浪费时间

@Data注释

@Data注解,它包含了@Getter@Setter@ToString@EqualsAndHashCode的功能。

不过也提醒我一点,构造实体类,一定写好构造函数,就用这个注释@Data

同时如果后面有需要进行实体类比较的操作,还需要重写equals函数

还有toString()函数也可以重写

啊啊啊啊这些东西就是知道了解但是从来没有在独立编码的时候想到

所以以后不懂就搜,没事就搜搜 ,积累积累积累,融会贯通


http://www.kler.cn/a/430321.html

相关文章:

  • IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡
  • (七)人工智能进阶之人脸识别:从刷脸支付到智能安防的奥秘,小白都可以入手的MTCNN+Arcface网络
  • 操作手册:集成钉钉审批实例消息监听配置
  • Bash语言的数据库编程
  • MATLAB对文件处理
  • 使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
  • 【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
  • 文生图模型开源之光!ComfyUI - AuraFlow本地部署教程
  • 如何拦截伪蜘蛛、假蜘蛛
  • 【漫话机器学习系列】002.拟合度:调整R方(Adjusted R-Squared)
  • 迅为RK3576开发板满足了4G/5G、wifi6、多网口、NPU等扩展需求
  • vue入门实战(二)父子组件显示,参数传递
  • minio参考官方文档实现多节点部署,基于ubuntu,还是失败了。。。。
  • 香港科技大学广州|智能交通学域博士招生宣讲会—同济大学专场
  • Cesium 问题: 添加billboard后移动或缩放地球,标记点位置会左右偏移
  • 设置笔记本同时连接内外网
  • 【学习总结|DAY015】Java面向对象高级-抽象类、接口
  • [Redis#16] 事务 | vs Mysql | 命令 | WATCH的实现
  • 云原生概念讲解一下
  • 如何在 JavaScript 中进行深度克隆?
  • C语言 while/do-while/for/goto
  • 组件开发的环境准备: nodejs安装,npm镜像源的修改,pnpm包管理器的安装(全局安装),基于pnpm创建脚手架项目
  • 性能测试攻略(一):需求分析
  • 【Linux】通过crond服务设置定时执行shell脚本,实际执行时间却延迟了8小时
  • NASH均衡存在性证明
  • Python 3 和 MongoDB 的集成使用