记一次开发中遇到的FastJson空指针异常,一定要注意:实体类中除了属性的set和get方法,其他自定义方法一定要慎用get和set开头
这里我主要是实现一个简单的评论功能:
实体类(Comment):
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class Comment implements Serializable{
private Long id;private Long blogId;private Long parentId;private String name;private String comment;private Date createTiime;public Integer getType(){
return this.parentId == 0? 1:2;}
}
以上是一个简单的实体类,保存评论的信息,这里使用lombok注解来生成get和set方法,以及对应的构造方法。在实体类中,自定义了一个方法getType(),这个方法是用来判断该评论是否是回复其他评论的,问题也就出现在这个方法上。
在接下来的操作中,需要实现一个更新的功能,需要的参数为id和comment。
//首先创建类,并传入参数
Comment comment = Comment.builder().id(id).comment(comment).build();
//打印日志
log.info("更新参数: {}",JSON.toJSONString(comment));
//接下来是一些非空判断,以及数据库的操作,这里省略不写
......
接下来,在测试的时候,传入id和comment,调用更新的方法,最后出现空指针异常 , 通过查看异常信息,定位到 打印日志的语句:
log.info("更新参数: {}",JSON.toJSONString(comment));
进一步查看,最终错误指向实体类中的 getType() 方法。
之后在网上查找了许多解决方案,但是都和我遇到的不太一样,我就想是不是方法名的问题,因为传入参数没有parentId,并且方法名字是 getType() ,使得会自动执行get开头的方法(??),但是实际上parentId是没有的,所以才报空指针异常的呢?
为了验证自己的想法是否正确,将getType()方法名字改为obtainType()方法,再次运行后一切正常!
并且不更改方法名字的前提下,添加了新的参数parentId,结果也不报错!
最后,使用了第一种方式,更改了getType()的名字,虽然运行已经没有问题了,但是还是不太了解为什么这样改就没有错误了,问题的答案只能去阅读相关源码来找到了! 还好的是,问题是解决了!
fastjson:
1、所有需要序列化的字段都用public
2、所有public方法开头不允许是get或者set
3、内部类一定要加上public static修饰
4、遵循以上3条,fastjson即可保证又快又正确
几种序列化与get和set的关系:
1、FastJson会出现空指针,证明与get开头的方法有关
2、Google的Gson不会出现异常,因为只和属性有关,和get开头的方法无关
3、Java开源的Jackson也会出现异常,证明与get开头的方法有关