1
项目中需要pojo的setter方法做特殊处理,在fastjson的1.2.58版本中JSONObject.toJavaObject无法调用setter方法。在fastjson的1.2.31版本是通过Method.invoke调用setter方法可触发自定义setter方法,在1.2.58版本中是通filed的set方法直接赋值,因而无法调用自己的setter方法。
项目中需要pojo的setter方法做特殊处理,在fastjson的1.2.58版本中JSONObject.toJavaObject无法调用setter方法。在fastjson的1.2.31版本是通过Method.invoke调用setter方法可触发自定义setter方法,在1.2.58版本中是通filed的set方法直接赋值,因而无法调用自己的setter方法。
为啥改成filed的set
57的这个commit 54f45e373e0d321cbe830847c7007f0a478aa219突然改成优先field了,引起了业务的问题,重现代码如下,依赖于setter方法去设置其它字段。
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import junit.framework.Assert;
public class TestFastJson {
@Test
public void testCanNotGetValueBySetter() throws Exception {
String payloadText = "{\"data\":{\"authorizeType\":\"ADMIN\",\"namespaceStatus\":\"NORMAL\","
+ "\"namespace\":\"test-demo\"}}";
JSONObject json = JSON.parseObject(payloadText);
Payload payloadObject = json.getObject("data", Payload.class);
Assert.assertNotNull(payloadObject.getName());
Assert.assertEquals("test-demo",payloadObject.getName());
}
public static class Payload {
private String namespace;
private String name;
private String namespaceId;
public void setNamespace(String namespace) {
this.namespace = namespace;
this.name = namespace;
}
public void setName(String name) {
this.name = name;
this.namespace = name;
}
public String getNamespaceId() {
return namespaceId;
}
public void setNamespaceId(String namespaceId) {
this.namespaceId = namespaceId;
}
public String getNamespace() {
return namespace;
}
public String getName() {
return name;
}
}
}
项目里也遇到这个问题,有安全的解决方案没?