[alibaba/fastjson]1.2.58版本中JSONObject.toJavaObject方法无法调用pojo的自己写的setter方法

2024-08-30 659 views
1

项目中需要pojo的setter方法做特殊处理,在fastjson的1.2.58版本中JSONObject.toJavaObject无法调用setter方法。在fastjson的1.2.31版本是通过Method.invoke调用setter方法可触发自定义setter方法,在1.2.58版本中是通filed的set方法直接赋值,因而无法调用自己的setter方法。

回答

4

为啥改成filed的set

1

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;
        }

    }
}
7

项目里也遇到这个问题,有安全的解决方案没?