diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java index 76f97be7..fe690a85 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java @@ -1,25 +1,25 @@ package me.chanjar.weixin.mp.util.xml; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - import com.thoughtworks.xstream.XStream; - import me.chanjar.weixin.common.util.xml.XStreamInitializer; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMusicMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVideoMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVoiceMessage; +import me.chanjar.weixin.mp.bean.message.*; -public class XStreamTransformer { +import java.io.InputStream; +import java.util.*; - protected static final Map, XStream> CLASS_2_XSTREAM_INSTANCE = configXStreamInstance(); +public class XStreamTransformer { + private static final Map, XStream> CLASS_2_XSTREAM_INSTANCE = new HashMap<>(); + + static { + registerClass(WxMpXmlMessage.class); + registerClass(WxMpXmlOutMusicMessage.class); + registerClass(WxMpXmlOutNewsMessage.class); + registerClass(WxMpXmlOutTextMessage.class); + registerClass(WxMpXmlOutImageMessage.class); + registerClass(WxMpXmlOutVideoMessage.class); + registerClass(WxMpXmlOutVoiceMessage.class); + registerClass(WxMpXmlOutTransferKefuMessage.class); + } /** * xml -> pojo @@ -36,16 +36,6 @@ public class XStreamTransformer { return object; } - /** - * 注册扩展消息的解析器 - * @param clz 类型 - * @param xStream xml解析器 - */ - public static void register(Class clz, XStream xStream) { - CLASS_2_XSTREAM_INSTANCE.put(clz,xStream); - } - - /** * pojo -> xml */ @@ -53,83 +43,40 @@ public class XStreamTransformer { return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object); } - private static Map, XStream> configXStreamInstance() { - Map, XStream> map = new HashMap<>(); - map.put(WxMpXmlMessage.class, config_WxMpXmlMessage()); - map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage()); - map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage()); - map.put(WxMpXmlOutTextMessage.class, config_WxMpXmlOutTextMessage()); - map.put(WxMpXmlOutImageMessage.class, config_WxMpXmlOutImageMessage()); - map.put(WxMpXmlOutVideoMessage.class, config_WxMpXmlOutVideoMessage()); - map.put(WxMpXmlOutVoiceMessage.class, config_WxMpXmlOutVoiceMessage()); - map.put(WxMpXmlOutTransferKefuMessage.class, config_WxMpXmlOutTransferCustomerServiceMessage()); - - return map; - } - - private static XStream config_WxMpXmlMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlMessage.class); - xstream.processAnnotations(WxMpXmlMessage.ScanCodeInfo.class); - xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.class); - xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.Item.class); - xstream.processAnnotations(WxMpXmlMessage.SendLocationInfo.class); - - xstream.aliasField("MsgID", WxMpXmlMessage.class, "msgId"); - return xstream; - } - - private static XStream config_WxMpXmlOutImageMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutImageMessage.class); - return xstream; - } - - private static XStream config_WxMpXmlOutNewsMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutNewsMessage.class); - xstream.processAnnotations(WxMpXmlOutNewsMessage.Item.class); - return xstream; + /** + * 注册扩展消息的解析器 + * + * @param clz 类型 + * @param xStream xml解析器 + */ + public static void register(Class clz, XStream xStream) { + CLASS_2_XSTREAM_INSTANCE.put(clz, xStream); } - private static XStream config_WxMpXmlOutMusicMessage() { + public static void registerClass(Class clz) { XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutMusicMessage.class); - xstream.processAnnotations(WxMpXmlOutMusicMessage.Music.class); - return xstream; + xstream.processAnnotations(clz); + xstream.processAnnotations(getInnerClasses(clz)); + register(clz, xstream); } - private static XStream config_WxMpXmlOutTextMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutTextMessage.class); - return xstream; - } + private static Class[] getInnerClasses(Class clz) { + Class[] innerClasses = clz.getClasses(); + if (innerClasses == null) { + return null; + } - private static XStream config_WxMpXmlOutVideoMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutVideoMessage.class); - xstream.processAnnotations(WxMpXmlOutVideoMessage.Video.class); - return xstream; - } + List> result = new ArrayList<>(); + result.addAll(Arrays.asList(innerClasses)); + for (Class inner : innerClasses) { + Class[] innerClz = getInnerClasses(inner); + if (innerClz == null) { + continue; + } - private static XStream config_WxMpXmlOutVoiceMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutVoiceMessage.class); - return xstream; - } + result.addAll(Arrays.asList(innerClz)); + } - private static XStream config_WxMpXmlOutTransferCustomerServiceMessage() { - XStream xstream = XStreamInitializer.getInstance(); - xstream.processAnnotations(WxMpXmlOutMessage.class); - xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.class); - xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.TransInfo.class); - return xstream; + return result.toArray(new Class[0]); } - }