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" +
+ " \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));
+ }
}