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

浙公网安备 33010602011771号