From 7364d8ab6ed9d77df2614b8eb5e4c1c21e07b31a Mon Sep 17 00:00:00 2001 From: jimcao Date: Fri, 19 Apr 2024 09:44:06 +0800 Subject: [PATCH 1/6] fixed pojoutils string class issue --- .../org/apache/dubbo/common/utils/PojoUtils.java | 6 +++++- .../apache/dubbo/common/utils/PojoUtilsTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java index cdf625049b1..b4de1221e22 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java @@ -612,7 +612,11 @@ private static Object realize1( } else if (field != null) { value = realize1(value, field.getType(), field.getGenericType(), mapGeneric, history); try { - field.set(dest, value); + if (value.getClass() == String.class) { + dest = value; + } else { + field.set(dest, value); + } } catch (IllegalAccessException e) { throw new RuntimeException( "Failed to set field " + name + " of pojo " diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java index 67e3584e1ba..ec0ec50ddd6 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java @@ -1066,6 +1066,21 @@ public int hashCode() { } } + @Test + public void testPojoWithPrimitivesStringClass() { + String expect = "abc123"; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("value", expect); + jsonObject.put("class", "java.lang.String"); + Object[] objects = new Object[]{jsonObject}; + Class[] types = new Class[]{String.class}; + Type[] gtType = new Type[]{String.class}; + Object[] realize = PojoUtils.realize(objects, types, gtType); + assertEquals(realize.length, 1); + assertEquals(realize[0], expect); + } + + public enum Day { SUNDAY, MONDAY, From 3f222e5df94d70ed4cbb00750fe0f4efed60a0a1 Mon Sep 17 00:00:00 2001 From: jimcao Date: Wed, 8 May 2024 13:33:02 +0800 Subject: [PATCH 2/6] formatting test case code --- .../java/org/apache/dubbo/common/utils/PojoUtilsTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java index ec0ec50ddd6..8215fccf0bb 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java @@ -1072,15 +1072,14 @@ public void testPojoWithPrimitivesStringClass() { JSONObject jsonObject = new JSONObject(); jsonObject.put("value", expect); jsonObject.put("class", "java.lang.String"); - Object[] objects = new Object[]{jsonObject}; - Class[] types = new Class[]{String.class}; - Type[] gtType = new Type[]{String.class}; + Object[] objects = new Object[] {jsonObject}; + Class[] types = new Class[] {String.class}; + Type[] gtType = new Type[] {String.class}; Object[] realize = PojoUtils.realize(objects, types, gtType); assertEquals(realize.length, 1); assertEquals(realize[0], expect); } - public enum Day { SUNDAY, MONDAY, From ab6b3ba1eb6d4313bd2ebc2654b560270f94931e Mon Sep 17 00:00:00 2001 From: jimcao Date: Wed, 8 May 2024 14:54:22 +0800 Subject: [PATCH 3/6] Only process the dest class if string --- .../main/java/org/apache/dubbo/common/utils/PojoUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java index b4de1221e22..c5500e89567 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java @@ -612,8 +612,8 @@ private static Object realize1( } else if (field != null) { value = realize1(value, field.getType(), field.getGenericType(), mapGeneric, history); try { - if (value.getClass() == String.class) { - dest = value; + if (value.getClass() == String.class && dest.getClass() == String.class) { + return value; } else { field.set(dest, value); } From f4b40c701cbc9a96b6479852880f3378d760fcae Mon Sep 17 00:00:00 2001 From: jimcao Date: Wed, 8 May 2024 16:34:41 +0800 Subject: [PATCH 4/6] field set access ignore jdk classes --- .../src/main/java/org/apache/dubbo/common/utils/PojoUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java index c5500e89567..fedb23baf19 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java @@ -778,7 +778,8 @@ private static Field getField(Class cls, String fieldName) { for (Class acls = cls; acls != null; acls = acls.getSuperclass()) { try { result = acls.getDeclaredField(fieldName); - if (!Modifier.isPublic(result.getModifiers())) { + // the field is not public and it not jdk class, we will setAccessible to true + if (!Modifier.isPublic(result.getModifiers()) && acls.getClassLoader() != null) { result.setAccessible(true); } } catch (NoSuchFieldException e) { From c11db23fb53f69553f09a3c4cd25e4c3008ccffa Mon Sep 17 00:00:00 2001 From: jimcao Date: Wed, 8 May 2024 17:53:43 +0800 Subject: [PATCH 5/6] refine unit test case --- .../java/org/apache/dubbo/common/utils/PojoUtilsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java index 8215fccf0bb..59655f02fa0 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java @@ -1076,8 +1076,8 @@ public void testPojoWithPrimitivesStringClass() { Class[] types = new Class[] {String.class}; Type[] gtType = new Type[] {String.class}; Object[] realize = PojoUtils.realize(objects, types, gtType); - assertEquals(realize.length, 1); - assertEquals(realize[0], expect); + assertEquals(1, realize.length); + assertEquals(expect, realize[0]); } public enum Day { From 120a29fc79b975a0c43659b0c94fbacfe89dd08c Mon Sep 17 00:00:00 2001 From: jimcao Date: Wed, 8 May 2024 17:55:27 +0800 Subject: [PATCH 6/6] refind unit test case --- .../test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java index 59655f02fa0..d00139ecd8c 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/PojoUtilsTest.java @@ -1067,7 +1067,7 @@ public int hashCode() { } @Test - public void testPojoWithPrimitivesStringClass() { + void testPojoWithPrimitivesStringClass() { String expect = "abc123"; JSONObject jsonObject = new JSONObject(); jsonObject.put("value", expect);