重写get方法导致json序列化之后值改变的问题
问题描述
在开发中,我发现有一个接口某一个字段返回的值和数据库中的实际值并不一样
数据库中值:
id diameter
1 10
接口返回值:
{
"id": 1,
"diameter": 5
}
问题排查
发现,在getDiameter()
方法中,有人将diameter
除以了2
public Integer getDiameter() {
if (diameter != null) {
return diameter / 2;
}
return diameter;
}
由此我怀疑,就是getDiameter
方法出现了问题。
经过查询资料得知,springMVC
会使用jackson
将java
对象转换为json
字符串,再写到responsebody
中,而在进行json
序列化时,jackson
会调用字段的getXXX
方法进行序列化,所以在序列化后diameter
的值变成了原来的一半。
问题解决
经过分析和发现,getDiameter
中不应该直接除以2,这么设计明显是不合理的,故将getDiameter
函数改为getRadius
函数
public Integer getDiameter() {
return diameter;
}
@JsonIgnore // 表示在序列化或反序列化过程中忽略该属性
public Integer getRadius() {
if (diameter != null) {
return diameter / 2;
}
return diameter;
}
总结
当我们需要对某一个字段经过计算后再返回值时,不应该直接在其get
方法中处理,而应该重新写一个get
方法来获取该字段计算后的值。
参考文章
https://blog.youkuaiyun.com/qq_43842093/article/details/124769772
https://zhuanlan.zhihu.com/p/110786732