Java DTO数据响应回前端时JSON对象中多出一些未知属性

来源:互联网 发布:淘宝刷评论免费送衣服 编辑:程序博客网 时间:2024/06/01 10:46

1. 问题描述   

  项目过程中,测试那边反映ResponseBody返回前端的JSON中,某个DTO多出了一个属性"empty : false",DTO如下:

public class Description {    private String name;    private String dosage;    private String route;    private String strength;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDosage() {        return dosage;    }    public void setDosage(String dosage) {        this.dosage = dosage;    }    public String getRoute() {        return route;    }    public void setRoute(String route) {        this.route = route;    }    public String getStrength() {        return strength;    }    public void setStrength(String strength) {        this.strength = strength;    }    public boolean isEmpty() {        return this.dosage == null && this.strength == null && this.name == null && this.route == null;    }}

2. 问题分析

  1. DTO中没有这个empty属性。
  2. 但是有一个boolean isEmpty()方法。

显而易见,jackson在将对象转化成JSON字符串的过程中,调用了isEmpty(),并且从方法名中解析出了empty属性。

3. 解决

  解决很简单,把isEmpty()方法去掉或者改名不要使用is和get开头的名字,或者使用@JsonIgnore注解这个方法。其实在DTO中出现一个isEmpty()方法本来就不太好,但由于DTO不是标准JavaBean,暂且先这样。

4. 思考

  JavaBean的规范中有明确规定,对于boolean类型的属性,其getter可以使用get开头和is开头的方法,从上面的问题来看,springMVC的jackson在将一个对象转化成JSON字符串时,并不会检查属性是否存在,而是直接调用getter。
  把isEmpty()改成getEmpty()同样会多出一个empty属性,但是jackson会检查getter的返回类型,如果这个getter的返回值是非boolean类型,却用is开头,这样是不会被jackson调用的。以上可以自己试验一下。
  这也能解释为什么JavaBean规定必须有无参构造方法和与成员属性相关的setter和getter方法,而且还尽量不要在JavaBean中添加其它的方法。

阅读全文
0 0
原创粉丝点击