From 5ffc7f2a98739eb7844c84a033c170ba74724b03 Mon Sep 17 00:00:00 2001 From: jinyu Date: Sat, 13 Jun 2015 22:39:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86xml=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=8C=85=E5=90=AB$n=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xml}/ListsuffixResultDeserializer.java | 130 ++++++++---------- .../com/foxinmy/weixin4j/mp/api/Pay2Api.java | 6 +- .../com/foxinmy/weixin4j/mp/api/Pay3Api.java | 11 +- .../weixin4j/mp/test/XmlstreamTest.java | 23 ++-- 4 files changed, 82 insertions(+), 88 deletions(-) rename {weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/conver => weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml}/ListsuffixResultDeserializer.java (78%) diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/conver/ListsuffixResultDeserializer.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/ListsuffixResultDeserializer.java similarity index 78% rename from weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/conver/ListsuffixResultDeserializer.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/ListsuffixResultDeserializer.java index ddecb0c0..e38b87d1 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/conver/ListsuffixResultDeserializer.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/ListsuffixResultDeserializer.java @@ -1,4 +1,4 @@ -package com.foxinmy.weixin4j.mp.payment.conver; +package com.foxinmy.weixin4j.xml; import java.io.StringReader; import java.io.StringWriter; @@ -24,11 +24,8 @@ import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.stream.StreamSource; import com.foxinmy.weixin4j.model.Consts; -import com.foxinmy.weixin4j.mp.payment.coupon.CouponInfo; import com.foxinmy.weixin4j.util.ReflectionUtil; import com.foxinmy.weixin4j.util.StringUtil; -import com.foxinmy.weixin4j.xml.ListWrapper; -import com.foxinmy.weixin4j.xml.XmlStream; /** * 对 后缀为_$n 的 xml节点反序列化 @@ -47,46 +44,53 @@ public class ListsuffixResultDeserializer { .compile("_\\d{1,}_\\d{1,}$"); /** - * 对包含 coupon_id_$n 节点的转换 如V3订单查询接口 + * 对包含$n节点的xml序列化 * * @param content + * xml内容 * @param clazz + * @param listPropertyName + * 转换为list的属性名称 * @return */ - public static T containCouponDeserialize(String content, Class clazz) { - return deserialize(content, clazz, "couponList"); - } - - /** - * 对包含 refund_id_$n 节点的转换 如V2退款查询接口 - * - * @param content - * @param clazz - * @return - */ - public static T containRefundDeserialize(String content, Class clazz) { - return deserialize(content, clazz, "refundList"); - } - - /** - * 对同时包含 refund_id_$n 和 coupon_refund_id_$n_$m 节点的转换 如V3退款查询接口 - * - * @param content - * @param clazz - * @return - */ - public static T containRefundDetailDeserialize(String content, - Class clazz) { + public static T deserialize(String content, Class clazz, + String listPropertyName) { T t = XmlStream.fromXML(content, clazz); Class wrapperClazz = ReflectionUtil.getFieldGenericType(t, - "refundList"); + listPropertyName); + ListWrapper listWrapper = deserializeToListWrapper(content, + wrapperClazz); + if (listWrapper != null) { + ReflectionUtil.invokeSetterMethod(t, listPropertyName, + listWrapper.getItems(), List.class); + } + return t; + } + + /** + * 对同时包含$n和$n_$m的xml序列化 如 refund_id_$n 和 coupon_refund_id_$n_$m V3退款查询接口 + * + * @param content + * xml内容 + * @param clazz + * @param mainlistPropertyName + * $n结尾转换为list的属性名称 + * @param subListPropertyName + * $n_$m结尾转换为list的熟悉名称 + * @return + */ + public static T deserializeHasTwoSuffix(String content, Class clazz, + String mainlistPropertyName, String subListPropertyName) { + T t = XmlStream.fromXML(content, clazz); + Class wrapperClazz = ReflectionUtil.getFieldGenericType(t, + mainlistPropertyName); XMLStreamReader xr = null; try { xr = XMLInputFactory.newInstance().createXMLStreamReader( new StringReader(content)); Matcher matcher = null; - Map> refundMap = new HashMap>(); - Map couponMap = new HashMap(); + Map> mainMap = new HashMap>(); + Map subMap = new HashMap(); while (true) { int event = xr.next(); if (event == XMLStreamConstants.END_DOCUMENT) { @@ -107,9 +111,9 @@ public class ListsuffixResultDeserializer { key = matcher.group().replaceFirst( SUFFIX_PATTERN.pattern(), ""); StringBuilder sb = null; - if ((sb = couponMap.get(key)) == null) { + if ((sb = subMap.get(key)) == null) { sb = new StringBuilder(); - couponMap.put(key, sb); + subMap.put(key, sb); } String reverserName = new StringBuffer( new StringBuilder(name) @@ -124,9 +128,9 @@ public class ListsuffixResultDeserializer { .append(">"); } else { Map innerMap = null; - if ((innerMap = refundMap.get(key)) == null) { + if ((innerMap = mainMap.get(key)) == null) { innerMap = new HashMap(); - refundMap.put(key, innerMap); + mainMap.put(key, innerMap); } innerMap.put(name.replace(key, ""), xr.getText()); @@ -136,7 +140,7 @@ public class ListsuffixResultDeserializer { } } } - if (!refundMap.isEmpty()) { + if (!mainMap.isEmpty()) { String itemName = StringUtil.uncapitalize(wrapperClazz .getSimpleName()); XmlRootElement rootElement = wrapperClazz @@ -153,18 +157,18 @@ public class ListsuffixResultDeserializer { ; } } - List refundList = new ArrayList(); + List mainList = new ArrayList(); StringBuilder xmlBuilder = new StringBuilder(); - for (Iterator>> refundIt = refundMap + for (Iterator>> refundIt = mainMap .entrySet().iterator(); refundIt.hasNext();) { xmlBuilder.delete(0, xmlBuilder.length()); xmlBuilder.append("<").append(itemName).append(">"); - Entry> refundEntry = refundIt + Entry> mainEntry = refundIt .next(); - for (Iterator> refundInnerIt = refundEntry - .getValue().entrySet().iterator(); refundInnerIt + for (Iterator> mainInnerIt = mainEntry + .getValue().entrySet().iterator(); mainInnerIt .hasNext();) { - Entry entry = refundInnerIt.next(); + Entry entry = mainInnerIt.next(); xmlBuilder.append("<").append(entry.getKey()) .append(">"); xmlBuilder.append(entry.getValue()); @@ -172,24 +176,25 @@ public class ListsuffixResultDeserializer { .append(">"); } xmlBuilder.append(""); - Object refund = XmlStream.fromXML(xmlBuilder.toString(), + Object main = XmlStream.fromXML(xmlBuilder.toString(), wrapperClazz); - StringBuilder couponXml = couponMap.get(refundEntry - .getKey()); - if (couponXml != null) { - ListWrapper listWrapper = toListWrapper( + StringBuilder subXml = subMap.get(mainEntry.getKey()); + if (subXml != null) { + ListWrapper listWrapper = deserializeToListWrapper( String.format("%s", - couponXml.toString()), CouponInfo.class); + subXml.toString()), + ReflectionUtil.getFieldGenericType(main, + subListPropertyName)); if (listWrapper != null) { - ReflectionUtil.invokeSetterMethod(refund, - "couponList", listWrapper.getItems(), - List.class); + ReflectionUtil.invokeSetterMethod(main, + subListPropertyName, + listWrapper.getItems(), List.class); } } - refundList.add(refund); + mainList.add(main); } - ReflectionUtil.invokeSetterMethod(t, "refundList", refundList, - List.class); + ReflectionUtil.invokeSetterMethod(t, mainlistPropertyName, + mainList, List.class); } } catch (XMLStreamException e) { throw new IllegalArgumentException(e); @@ -205,21 +210,8 @@ public class ListsuffixResultDeserializer { return t; } - public static T deserialize(String content, Class clazz, - String listPropertyName) { - T t = XmlStream.fromXML(content, clazz); - Class wrapperClazz = ReflectionUtil.getFieldGenericType(t, - listPropertyName); - ListWrapper listWrapper = toListWrapper(content, wrapperClazz); - if (listWrapper != null) { - ReflectionUtil.invokeSetterMethod(t, listPropertyName, - listWrapper.getItems(), List.class); - } - return t; - } - @SuppressWarnings("unchecked") - public static ListWrapper toListWrapper(String content, + public static ListWrapper deserializeToListWrapper(String content, Class clazz) { XMLStreamReader xr = null; XMLStreamWriter xw = null; diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java index b3b52488..f9c2531a 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java @@ -34,7 +34,6 @@ import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.mp.model.WeixinMpAccount; import com.foxinmy.weixin4j.mp.payment.PayUtil; -import com.foxinmy.weixin4j.mp.payment.conver.ListsuffixResultDeserializer; import com.foxinmy.weixin4j.mp.payment.v2.Order; import com.foxinmy.weixin4j.mp.payment.v2.RefundRecord; import com.foxinmy.weixin4j.mp.payment.v2.RefundResult; @@ -49,6 +48,7 @@ import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.DigestUtil; import com.foxinmy.weixin4j.util.MapUtil; import com.foxinmy.weixin4j.util.StringUtil; +import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer; /** * V2支付API @@ -442,8 +442,8 @@ public class Pay2Api extends PayApi { String sign = PayUtil.paysignMd5(map, weixinAccount.getPartnerKey()); map.put("sign", sign.toLowerCase()); WeixinResponse response = weixinClient.get(refundquery_uri, map); - return ListsuffixResultDeserializer.containRefundDeserialize( - response.getAsString(), RefundRecord.class); + return ListsuffixResultDeserializer.deserialize(response.getAsString(), + RefundRecord.class, "refundList"); } @Override diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java index 050401ea..54350192 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java @@ -25,7 +25,6 @@ import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.mp.model.WeixinMpAccount; import com.foxinmy.weixin4j.mp.payment.PayUtil; -import com.foxinmy.weixin4j.mp.payment.conver.ListsuffixResultDeserializer; import com.foxinmy.weixin4j.mp.payment.v3.ApiResult; import com.foxinmy.weixin4j.mp.payment.v3.Order; import com.foxinmy.weixin4j.mp.payment.v3.RefundRecord; @@ -39,6 +38,7 @@ import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.util.StringUtil; +import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer; import com.foxinmy.weixin4j.xml.XmlStream; /** @@ -80,8 +80,8 @@ public class Pay3Api extends PayApi { String param = XmlStream.map2xml(map); String orderquery_uri = getRequestUri("orderquery_v3_uri"); WeixinResponse response = weixinClient.post(orderquery_uri, param); - return ListsuffixResultDeserializer.containCouponDeserialize( - response.getAsString(), Order.class); + return ListsuffixResultDeserializer.deserialize(response.getAsString(), + Order.class, "couponList"); } /** @@ -394,8 +394,9 @@ public class Pay3Api extends PayApi { map.put("sign", sign); String param = XmlStream.map2xml(map); WeixinResponse response = weixinClient.post(refundquery_uri, param); - return ListsuffixResultDeserializer.containRefundDetailDeserialize( - response.getAsString(), RefundRecord.class); + return ListsuffixResultDeserializer.deserializeHasTwoSuffix( + response.getAsString(), RefundRecord.class, "refundList", + "couponList"); } /** diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/XmlstreamTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/XmlstreamTest.java index 64ba7fab..a0f6904e 100644 --- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/XmlstreamTest.java +++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/XmlstreamTest.java @@ -7,9 +7,9 @@ import java.util.Map; import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.mp.payment.PayUtil; -import com.foxinmy.weixin4j.mp.payment.conver.ListsuffixResultDeserializer; import com.foxinmy.weixin4j.mp.payment.v2.RefundRecord; import com.foxinmy.weixin4j.mp.payment.v3.Order; +import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer; import com.foxinmy.weixin4j.xml.ListsuffixResultSerializer; import com.foxinmy.weixin4j.xml.XmlStream; @@ -62,8 +62,8 @@ public class XmlstreamTest { } catch (Exception e) { } - System.err.println(ListsuffixResultDeserializer - .containCouponDeserialize(sb.toString(), Order.class)); + System.err.println(ListsuffixResultDeserializer.deserialize( + sb.toString(), Order.class, "couponList")); } public static RefundRecord xml2refundRecordV2() throws Exception { @@ -79,8 +79,8 @@ public class XmlstreamTest { } catch (Exception e) { } - return ListsuffixResultDeserializer.containRefundDeserialize( - sb.toString(), RefundRecord.class); + return ListsuffixResultDeserializer.deserialize(sb.toString(), + RefundRecord.class, "refundList"); } public static void xml2refundRecordV3() throws Exception { @@ -97,8 +97,9 @@ public class XmlstreamTest { } System.err.println(ListsuffixResultDeserializer - .containRefundDetailDeserialize(sb.toString(), - com.foxinmy.weixin4j.mp.payment.v3.RefundRecord.class)); + .deserializeHasTwoSuffix(sb.toString(), + com.foxinmy.weixin4j.mp.payment.v3.RefundRecord.class, + "refundList", "couponList")); } public static void main(String[] args) throws Exception { @@ -106,15 +107,15 @@ public class XmlstreamTest { // xml2map(); // xml2order(); // xml2refundRecordV2(); - // xml2refundRecordV3(); + xml2refundRecordV3(); // object2xmlWithoutRootElement(); RefundRecord refundRecord = xml2refundRecordV2(); System.err.println(refundRecord); String sign = refundRecord.getSign(); refundRecord.setSign(null); - String validSign = PayUtil.paysignMd5(refundRecord, - "paysignkey"); + String validSign = PayUtil.paysignMd5(refundRecord, "paysignkey"); System.err.println("sign=" + sign + ",validSign=" + validSign); - System.err.println(ListsuffixResultSerializer.serializeToXML(refundRecord)); + System.err.println(ListsuffixResultSerializer + .serializeToXML(refundRecord)); } }