From 33929ce197289343273c24cb6822512dc0b757b4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 22 Aug 2019 14:30:43 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20#1169=20=E4=BF=AE=E5=A4=8D=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=9B=B4=E6=96=B0=E6=88=90=E5=91=98?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/xml/IntegerArrayConverter.java | 37 ++++++++++++++ .../common/util/xml/LongArrayConverter.java | 37 ++++++++++++++ .../util/xml/XStreamCDataConverter.java | 5 ++ .../weixin/cp/bean/WxCpXmlMessage.java | 5 +- .../weixin/cp/bean/WxCpXmlMessageTest.java | 50 +++++++++++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java new file mode 100644 index 00000000..3a82b213 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java @@ -0,0 +1,37 @@ +package me.chanjar.weixin.common.util.xml; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.thoughtworks.xstream.converters.basic.StringConverter; + +/** + * Integer型数组转换器. + * + * @author Binary Wang + * @date 2019-08-22 + */ +public class IntegerArrayConverter extends StringConverter { + @Override + public boolean canConvert(Class type) { + return type == Integer[].class; + } + + @Override + public String toString(Object obj) { + return ""; + } + + @Override + public Object fromString(String str) { + final Iterable iterable = Splitter.on(",").split(str); + final String[] strings = Iterables.toArray(iterable, String.class); + Integer[] result = new Integer[strings.length]; + int index = 0; + for (String string : strings) { + result[index++] = Integer.parseInt(string); + } + + return result; + } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java new file mode 100644 index 00000000..a383c596 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java @@ -0,0 +1,37 @@ +package me.chanjar.weixin.common.util.xml; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.thoughtworks.xstream.converters.basic.StringConverter; + +/** + * Long型数组转换器. + * + * @author Binary Wang + * @date 2019-08-22 + */ +public class LongArrayConverter extends StringConverter { + @Override + public boolean canConvert(Class type) { + return type == Long[].class; + } + + @Override + public String toString(Object obj) { + return ""; + } + + @Override + public Object fromString(String str) { + final Iterable iterable = Splitter.on(",").split(str); + final String[] strings = Iterables.toArray(iterable, String.class); + Long[] result = new Long[strings.length]; + int index = 0; + for (String string : strings) { + result[index++] = Long.parseLong(string); + } + + return result; + } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java index aa948b34..ab1b1688 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java @@ -2,6 +2,11 @@ package me.chanjar.weixin.common.util.xml; import com.thoughtworks.xstream.converters.basic.StringConverter; +/** + * CDATA 内容转换器,加上CDATA标签. + * + * @author Daniel Qian + */ public class XStreamCDataConverter extends StringConverter { @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index 771e5729..712eed83 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.util.XmlUtils; +import me.chanjar.weixin.common.util.xml.IntegerArrayConverter; +import me.chanjar.weixin.common.util.xml.LongArrayConverter; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import me.chanjar.weixin.cp.config.WxCpConfigStorage; import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; @@ -214,7 +216,7 @@ public class WxCpXmlMessage implements Serializable { * 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id. */ @XStreamAlias("Department") - @XStreamConverter(value = XStreamCDataConverter.class) + @XStreamConverter(value = LongArrayConverter.class) private Long[] departments; /** @@ -268,6 +270,7 @@ public class WxCpXmlMessage implements Serializable { * 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应. */ @XStreamAlias("IsLeaderInDept") + @XStreamConverter(value = IntegerArrayConverter.class) private Integer[] isLeaderInDept; /** diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java index e6efa043..f10b5d4f 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java @@ -2,9 +2,11 @@ package me.chanjar.weixin.cp.bean; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.cp.constant.WxCpConsts; +import me.chanjar.weixin.cp.util.xml.XStreamTransformer; import org.testng.annotations.Test; import static me.chanjar.weixin.cp.constant.WxCpConsts.EventType.TASKCARD_CLICK; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -222,4 +224,52 @@ public class WxCpXmlMessageTest { assertEquals(wxMessage.getUserId(), "zhangsan"); assertEquals(wxMessage.getExternalUserId(), "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w"); } + + public void testChangeContact() { + String xml = "\n" + + " \n" + + " \n" + + " 1403610513\n" + + " \n" + + " \n" + + " update_user\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 15913215421\n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " <![CDATA[企业微信]]>\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
"; + + WxCpXmlMessage wxCpXmlMessage = WxCpXmlMessage.fromXml(xml); + assertThat(wxCpXmlMessage).isNotNull(); + assertThat(wxCpXmlMessage.getDepartments()).isNotEmpty(); + + System.out.println(XStreamTransformer.toXml(WxCpXmlMessage.class, wxCpXmlMessage)); + } }