From 732b8667f0391e4ca7d5d78c582957a0edb0689b Mon Sep 17 00:00:00 2001 From: ywzou <11622651+ywzou@users.noreply.github.com> Date: Wed, 4 Sep 2024 20:24:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=88=B6=E7=B1=BB=E5=AD=97=E6=AE=B5=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E4=BA=86=E5=BF=BD=E7=95=A5=E5=AD=97=E6=AE=B5=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=AD=90=E7=B1=BB=E7=BB=A7=E6=89=BFget=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=BF=BD=E7=95=A5=E5=AD=97=E6=AE=B5=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=AD=BB=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=20(#2914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 父类字段定义了忽略字段后,自定继承get方法忽略字段不生效,导致死循环 父类字段定义了忽略字段后,自定继承get方法忽略字段不生效,导致死循环 * 进一步处理继承get方法死循环问题 进一步处理继承get方法死循环问题 --- .../writer/ObjectWriterBaseModule.java | 3 +- .../writer/ObjectWriterCreatorASM.java | 2 +- .../writer/InheritMethodWriterTest.java | 114 ++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 core/src/test/java/com/alibaba/fastjson2/writer/InheritMethodWriterTest.java diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterBaseModule.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterBaseModule.java index 030f3235d0..9fd8871f06 100644 --- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterBaseModule.java +++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterBaseModule.java @@ -772,8 +772,9 @@ public void getFieldInfo(BeanInfo beanInfo, FieldInfo fieldInfo, Class objectCla boolean ignore = fieldInfo.ignore; if (supperMethod != null) { getFieldInfo(beanInfo, fieldInfo, superclass, supperMethod); + Field field = BeanUtils.getField(objectClass, method); int supperMethodModifiers = supperMethod.getModifiers(); - if (ignore != fieldInfo.ignore + if (null != field && ignore != fieldInfo.ignore && !Modifier.isAbstract(supperMethodModifiers) && !supperMethod.equals(method) ) { diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java index 741806939b..6136118a92 100644 --- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java +++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java @@ -217,7 +217,7 @@ boolean record = BeanUtils.isRecord(objectClass); if (!record) { BeanUtils.declaredFields(objectClass, field -> { fieldInfo.init(); - fieldInfo.ignore = (field.getModifiers() & Modifier.PUBLIC) == 0 || (field.getModifiers() & Modifier.TRANSIENT) != 0; + fieldInfo.ignore = ((field.getModifiers() & Modifier.PUBLIC) == 0 || (field.getModifiers() & Modifier.TRANSIENT) != 0); FieldWriter fieldWriter = creteFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field); if (fieldWriter != null) { diff --git a/core/src/test/java/com/alibaba/fastjson2/writer/InheritMethodWriterTest.java b/core/src/test/java/com/alibaba/fastjson2/writer/InheritMethodWriterTest.java new file mode 100644 index 0000000000..ab14e85027 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/writer/InheritMethodWriterTest.java @@ -0,0 +1,114 @@ +package com.alibaba.fastjson2.writer; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.annotation.JSONField; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * 继承字段忽略 + */ +public class InheritMethodWriterTest { + @Test + public void writer() { + UrlEntity entity = new UrlEntity("https://www.baidu.com/web/user"); + entity.setName("rose"); + String text = JSON.toJSONString(entity); + assertEquals(text, "{\"name\":\"rose\"}"); + } + + @Test + public void read() { + String text = "{\"name\":\"rose\", \"url\":\"https://www.baidu.com/web/user\"}"; + UrlEntity entity = JSON.parseObject(text, UrlEntity.class); + System.out.println(entity); + assertEquals(entity.getName(), "rose"); + assertEquals(entity.getUrl(), "https://www.baidu.com/web/user?name=rose"); + } + public abstract static class AbstractJsonEntity { + @JSONField(serialize = false) + private String url; + + public AbstractJsonEntity(String url) { + this.url = url; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + public class UrlEntity + extends AbstractJsonEntity { + private String name; + + public UrlEntity(String url) { + super(url); + } + + // @JSONField(serialize = false) + @Override + public String getUrl() { + String text = JSON.toJSONString(this); + JSONObject queryObj = JSONObject.parseObject(text); + + StringBuffer query = new StringBuffer(); + Set keys = queryObj.keySet(); + for (String key : keys) { + String value = queryObj.getString(key); + if (StringUtils.isBlank(value)) { + continue; + } + + String encodeKey = ""; + String encodeValue = ""; + try { + encodeKey = URLEncoder.encode(key, "UTF-8"); + encodeValue = URLEncoder.encode(value, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + if (StringUtils.isBlank(encodeValue)) { + continue; + } + + if (StringUtils.isBlank(query)) { + query.append("?"); + } else { + query.append("&"); + } + query.append(encodeKey).append("=").append(encodeValue); + } + + if (StringUtils.isNotBlank(query)) { + return super.getUrl() + query; + } + + return super.getUrl(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "UrlEntity [name=" + name + ", url=" + getUrl() + "]"; + } + } +}