From 83b4114a9fc81bddaae6e120da33ebef29a6d44e Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Tue, 13 Jun 2023 08:35:20 +0800 Subject: [PATCH] Fix ServiceConfig Ref unable to toString (#12511) --- .../dubbo/common/utils/ToStringUtils.java | 63 +++++++++++++++++++ .../apache/dubbo/config/AbstractConfig.java | 3 +- .../dubbo/config/ServiceConfigTest.java | 16 +++++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ToStringUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ToStringUtils.java index d4057030983..507146736a7 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ToStringUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ToStringUtils.java @@ -16,7 +16,11 @@ */ package org.apache.dubbo.common.utils; +import org.apache.dubbo.config.AbstractConfig; + import java.util.Arrays; +import java.util.List; +import java.util.Map; public class ToStringUtils { @@ -36,4 +40,63 @@ public static String printToString(Object obj) { return obj.toString(); } } + + public static String toString(Object obj) { + if (obj == null) { + return "null"; + } + if (ClassUtils.isSimpleType(obj.getClass())) { + return obj.toString(); + } + if (obj.getClass().isPrimitive()) { + return obj.toString(); + } + if (obj instanceof Object[]) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("["); + Object[] objects = (Object[]) obj; + for (int i = 0; i < objects.length; i++) { + stringBuilder.append(toString(objects[i])); + if (i != objects.length - 1) { + stringBuilder.append(", "); + } + } + stringBuilder.append("]"); + return stringBuilder.toString(); + } + if (obj instanceof List) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("["); + List list = (List) obj; + for (int i = 0; i < list.size(); i++) { + stringBuilder.append(toString(list.get(i))); + if (i != list.size() - 1) { + stringBuilder.append(", "); + } + } + stringBuilder.append("]"); + return stringBuilder.toString(); + } + if (obj instanceof Map) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("{"); + Map map = (Map) obj; + int i = 0; + for (Object key : map.keySet()) { + stringBuilder.append(toString(key)); + stringBuilder.append("="); + stringBuilder.append(toString(map.get(key))); + if (i != map.size() - 1) { + stringBuilder.append(", "); + } + i++; + } + stringBuilder.append("}"); + return stringBuilder.toString(); + } + if (obj instanceof AbstractConfig) { + return obj.toString(); + } + return obj.getClass() + "@" + Integer.toHexString(System.identityHashCode(obj)); + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java index 6247a02bd4c..3e4daf34bc5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -31,6 +31,7 @@ import org.apache.dubbo.common.utils.MethodUtils; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.common.utils.ToStringUtils; import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.config.context.ConfigMode; import org.apache.dubbo.config.support.Nested; @@ -967,7 +968,7 @@ public String toString() { buf.append(' '); buf.append(key); buf.append("=\""); - buf.append(key.equals("password") ? "******" : value); + buf.append(key.equals("password") ? "******" : ToStringUtils.toString(value)); buf.append('\"'); } } catch (Exception e) { diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java index d65f110843f..fe5a0ad6439 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java @@ -683,4 +683,20 @@ public Set removeCachedMapping(String serviceKey) { scheduledExecutorService.shutdown(); } + + @Test + void testToString() { + ServiceConfig serviceConfig = new ServiceConfig<>(); + service.setRef(new DemoServiceImpl() { + @Override + public String toString() { + throw new IllegalStateException(); + } + }); + try { + serviceConfig.toString(); + } catch (Throwable t) { + Assertions.fail(t); + } + } }