diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtils.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtils.java index 3d54a3ed2ef..3f9356f21f1 100644 --- a/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtils.java +++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtils.java @@ -91,6 +91,19 @@ public static Object compatibleTypeConvert(Object value, Class type) { } catch (ClassNotFoundException e) { throw new RuntimeException(e.getMessage(), e); } + } else if (char[].class.equals(type)) { + // Process string to char array for generic invoke + // See + // - https://github.com/apache/incubator-dubbo/issues/2003 + if (string == null) { + return null; + } + else { + int len = string.length(); + char[] chars = new char[len]; + string.getChars(0, len, chars, 0); + return chars; + } } } else if (value instanceof Number) { Number number = (Number) value; diff --git a/dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtilsTest.java b/dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtilsTest.java index 4b230e9c9e9..63efc5b9542 100644 --- a/dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtilsTest.java +++ b/dubbo-common/src/test/java/com/alibaba/dubbo/common/utils/CompatibleTypeUtilsTest.java @@ -67,6 +67,17 @@ public void testCompatibleTypeConvert() throws Exception { result = CompatibleTypeUtils.compatibleTypeConvert("2011-12-11 12:24:12", Date.class); assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2011-12-11 12:24:12"), (Date) result); + + result = CompatibleTypeUtils.compatibleTypeConvert("ab", char[].class); + assertEquals(2, ((char[]) result).length); + assertEquals('a', ((char[]) result)[0]); + assertEquals('b', ((char[]) result)[1]); + + result = CompatibleTypeUtils.compatibleTypeConvert("", char[].class); + assertEquals(0, ((char[]) result).length); + + result = CompatibleTypeUtils.compatibleTypeConvert(null, char[].class); + assertEquals(null, result); } {