spring中getter方法自动调用问题:jackson或fastjson的使用

起因

发现这个问题是在做学习项目的时候发现的:在实体类中增加了一个字段并且生成getter和setter方法后,发现返回给前端的json中也同步增加了一个key-value对,也就是自动调用了getter方法。我从controller层debug检查到了mapper后都没有发现我对返回的json更改过。后来发现是springboot内置的jackson的原因,就顺便学习了一下jackson和fastjosn。

例子

springboot中内置了jackson,在返回对象时会自动转化为json格式。通过一些注解可以修改返回的json。
示例:实体类

public class TestClass {

    private Integer code;

    private String message;

    @JsonProperty("modify2test_field")
    private String testField;

    public TestClass() {
    }

    public TestClass(Integer code, String message,String testField) {
        this.code = code;
        this.message = message;
        this.testField = testField;
    }

    //非field的getter方法
    public String getResult() {
        return code + ":" + message;
    }

    public String getTestField() {
        return testField;
    }

    public void setTestField(String testField) {
        this.testField = testField;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "TestClass{" +
                "code=" + code +
                ", message='" + message + '\'' +
                '}';
    }
}

controller

@RestController
public class TestController {

    @RequestMapping("/test")
    public TestClass test() {
        TestClass testClass = new TestClass(200, "success","test");
        return testClass;
    }
}

对localhost:8080/test 发送请求后得到的json为:

{
  "code": 200,
  "message": "success",
  "result": "200:success",
  "modify2test_field": "test"
}

总结

在返回实体类时,jackson会自动调用其中的getter方法【private的需要同时有setter方法,或者在方法上加上@JsonIgnore注解】。

@JsonProperty("xxx")可以修改返回的json中的key值。

利用这个特性的应用:

   //非field的getter方法
    public String getResult() {
        return code + ":" + message;
    }

这样可以返回一些数据库字段中不存在的值,操作简便很多。

另外,springboot自带的输出json格式用的是jackson,需要注意的是使用fastjson处理controller层输出时可能还需要另外注入bean对象,fastjson中修改字段名的注解是@JsonField,和jackson的不同。(天知道我在这卡了多久)。

此外,常用的@Dateformat注解,或者JSON.toJSONString(object)方法也都是fastjson中的。

参考

https://www.cnblogs.com/Sinte-Beuve/p/7270782.html
https://blog.csdn.net/weixin_42078572/article/details/108499192

posted @ 2025-02-23 18:58  eien  阅读(70)  评论(0)    收藏  举报