From c74a8bdd46a03f4b2beea3cf8ae15d0bff93ab30 Mon Sep 17 00:00:00 2001 From: zhuyong Date: Thu, 26 Jul 2018 16:54:29 +0800 Subject: [PATCH] support char[] for generic invoke, #2003 --- .../dubbo/common/utils/CompatibleTypeUtils.java | 13 +++++++++++++ .../dubbo/common/utils/CompatibleTypeUtilsTest.java | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CompatibleTypeUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CompatibleTypeUtils.java index 424cead9b1b..14a0a79b267 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CompatibleTypeUtils.java +++ b/dubbo-common/src/main/java/org/apache/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/org/apache/dubbo/common/utils/CompatibleTypeUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CompatibleTypeUtilsTest.java index 8c51e0214d5..fc18ac77e10 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CompatibleTypeUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/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); } {