踩坑日记-@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序列化的区别:
-
toString()
方法:默认情况下,Java对象的toString()
方法返回的是类名@对象哈希码的十六进制表示,这通常用于调试,而不是展示对象的实际内容。 -
JSON序列化:将对象转换成JSON字符串,可以展示对象内部的实际数据,这对于日志记录和调试是非常有用的,因为它能让你看到对象的实际状态。
所以为啥我用JSON输出的就是数据内容,但是为啥我是空的呀
这通常意味着 Award
对象中的属性没有被正确序列化
序列化
没有正确序列化的原因有这些,
-
属性为Null:
Award
对象的属性可能为null
,导致序列化后显示为空对象。 -
Getter方法问题:
Award
类中的属性可能没有对应的公共getter方法,或者getter方法返回的是不可序列化的值。 -
序列化配置问题:使用的JSON序列化库(如FastJSON、Jackson等)可能需要特定的配置来正确处理对象序列化。
-
循环引用:
Award
对象中可能存在指向自身的引用或者相互引用,导致序列化库无法正确处理。 -
忽略序列化:
Award
类或其属性可能被注解标记为在序列化时忽略。 -
属性类型不匹配:
Award
类中的属性类型可能与JSON序列化库期望的类型不匹配。
看到第二点我突然意识到我创建实体类的时候确实没有加上构造函数,所以人间从数据库找到数据了,但是没有办法转换为实体类,因为没有构造函数,啊啊啊啊!!!
为啥没有加上构造函数,因为我忽略@Data注释有构造函数的作用,我以为他是用来表示数据形式的,我只需要引入包就行了,为啥还加这个注释然后就给这个注释删掉了
啊啊啊啊啊啊啊啊啊啊,愚蠢的错误,错误的编码习惯,不要想当然,不懂的一定要查,不差这一会,一出现bug更浪费时间
@Data注释
用@Data
注解,它包含了@Getter
、@Setter
、@ToString
、@EqualsAndHashCode
的功能。
不过也提醒我一点,构造实体类,一定写好构造函数,就用这个注释@Data
同时如果后面有需要进行实体类比较的操作,还需要重写equals函数
还有toString()函数也可以重写
啊啊啊啊这些东西就是知道了解但是从来没有在独立编码的时候想到
所以以后不懂就搜,没事就搜搜 ,积累积累积累,融会贯通