{"id":1396,"date":"2023-03-19T11:13:23","date_gmt":"2023-03-19T03:13:23","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1396"},"modified":"2023-04-28T21:10:32","modified_gmt":"2023-04-28T13:10:32","slug":"xstream-alias-parsing-conflict-with-same-name","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/19\/xstream-alias-parsing-conflict-with-same-name\/","title":{"rendered":"XStream\u540c\u540dalias\u89e3\u6790\u51b2\u7a81"},"content":{"rendered":"<p>\u5f53\u5b58\u5728\u591a\u4e2a\u540c\u540dalias\u6ce8\u89e3\u7684Model\uff08\u5bf9\u5e94XML\u6839\u6807\u7b7e\u76f8\u540c\uff09\u65f6\uff0cXStream\u89e3\u6790\u4f1a\u4ea7\u751f\u51b2\u7a81\uff0c\u9700\u8981\u751f\u6210\u5404\u81ea\u7684XStream\u5bf9\u8c61\u6765\u89e3\u6790<\/p>\n<p>\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/x-stream\/xstream\/issues\/130\">https:\/\/github.com\/x-stream\/xstream\/issues\/130<\/a><\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">public final class XmlUtil {\n  private final static ConcurrentMap&lt;Class&lt;?&gt;, XStream&gt; XSTREAMS = new ConcurrentHashMap&lt;&gt;();\n  private final static HierarchicalStreamDriver DRIVER = new XppDriver(new XmlFriendlyNameCoder(&quot;-&quot;, &quot;&quot;));\n  private XStream getXStream(Class&lt;?&gt; type) {\n    return XSTREAMS.computeIfAbsent(type, t -&gt; {\n      XStream xstream = new XStream(DRIVER);\n      xstream.processAnnotations(t);\n      xstream.allowTypes(new Class[]{t});\n      return xstream;\n    })\n  }\n  public static &lt;T&gt; T xmlToObject(String xml, Class&lt;? extends IRequest&gt; cls) {\n    return (T)getXStream(cls).fromXml(xml);\n  }\n}<\/code><\/pre>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">import com.lianlian.global.thai.provider.channel.gateway.alipay.transactionqrcode.model.response.AlipayCancelReturn;\nimport com.lianlian.global.thai.provider.channel.gateway.alipay.transactionqrcode.model.response.AlipayCreateReturn;\nimport com.lianlian.global.thai.provider.channel.gateway.alipay.transactionqrcode.model.response.AlipayQueryReturn;\nimport com.lianlian.global.thai.provider.channel.gateway.alipay.transactionqrcode.model.response.AlipayRefundReturn;\nimport com.thoughtworks.xstream.XStream;\nimport com.thoughtworks.xstream.io.HierarchicalStreamDriver;\nimport com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;\nimport com.thoughtworks.xstream.io.xml.XppDriver;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n@Slf4j\n@Component\npublic class XStreamHelper {\n\n    private XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder(&quot;_-&quot;, &quot;_&quot;))); \/\/\u89e3\u51b3\u4e0b\u5212\u7ebf\u95ee\u9898\n    private final static ConcurrentMap&lt;Class&lt;?&gt;, XStream&gt; xStreamMap = new ConcurrentHashMap&lt;&gt;();\n    private final static HierarchicalStreamDriver DRIVER = new XppDriver(new XmlFriendlyNameCoder(&quot;_-&quot;, &quot;_&quot;));\n\n    private XStream getXStream(Class&lt;?&gt; type) {\n        return xStreamMap.computeIfAbsent(type, t -&gt; {\n            XStream xStream = new XStream(DRIVER);\n            xStream.processAnnotations(t);\n            xStream.allowTypes(new Class[]{t});\n            return xStream;\n        });\n    }\n\n    public AlipayCreateReturn parseAlipayCreateReturn(String response) {\n        XStream xStream = getXStream(AlipayCreateReturn.class);\n        \/\/com.thoughtworks.xstream.mapper.CannotResolveClassException: alipay\n        xStream.alias(&quot;alipay&quot;, AlipayCreateReturn.class);\n        \/\/com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field\n        xStream.autodetectAnnotations(true); \/\/\u81ea\u52a8\u68c0\u6d4b\u6ce8\u89e3\n        xStream.processAnnotations(AlipayCreateReturn.class); \/\/\u5e94\u7528Bean\u7c7b\u7684\u6ce8\u89e3\n        AlipayCreateReturn alipayCreateReturn = (AlipayCreateReturn) xStream.fromXML(response);\n        log.info(alipayCreateReturn.toString());\n        return alipayCreateReturn;\n    }\n\n    public AlipayRefundReturn parseAlipayRefundReturn(String response) {\n        XStream xStream = getXStream(AlipayRefundReturn.class);\n        \/\/com.thoughtworks.xstream.mapper.CannotResolveClassException: alipay\n        xStream.alias(&quot;alipay&quot;, AlipayRefundReturn.class);\n        \/\/com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field\n        xStream.autodetectAnnotations(true); \/\/\u81ea\u52a8\u68c0\u6d4b\u6ce8\u89e3\n        xStream.processAnnotations(AlipayRefundReturn.class); \/\/\u5e94\u7528Bean\u7c7b\u7684\u6ce8\u89e3\n        AlipayRefundReturn alipayRefundReturn = (AlipayRefundReturn) xStream.fromXML(response);\n        log.info(alipayRefundReturn.toString());\n        return alipayRefundReturn;\n    }\n\n    public AlipayQueryReturn parseAlipayQueryReturn(String response) {\n        XStream xStream = getXStream(AlipayQueryReturn.class);\n        \/\/com.thoughtworks.xstream.mapper.CannotResolveClassException: alipay\n        xStream.alias(&quot;alipay&quot;, AlipayQueryReturn.class);\n        \/\/com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field\n        xStream.autodetectAnnotations(true); \/\/\u81ea\u52a8\u68c0\u6d4b\u6ce8\u89e3\n        xStream.processAnnotations(AlipayQueryReturn.class); \/\/\u5e94\u7528Bean\u7c7b\u7684\u6ce8\u89e3\n        AlipayQueryReturn alipayQueryReturn = (AlipayQueryReturn) xStream.fromXML(response);\n        log.info(alipayQueryReturn.toString());\n        return alipayQueryReturn;\n    }\n\n    public AlipayCancelReturn parseAlipayCancelReturn(String response) {\n        XStream xStream = getXStream(AlipayCancelReturn.class);\n        \/\/com.thoughtworks.xstream.mapper.CannotResolveClassException: alipay\n        xStream.alias(&quot;alipay&quot;, AlipayCancelReturn.class);\n        \/\/com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field\n        xStream.autodetectAnnotations(true); \/\/\u81ea\u52a8\u68c0\u6d4b\u6ce8\u89e3\n        xStream.processAnnotations(AlipayCancelReturn.class); \/\/\u5e94\u7528Bean\u7c7b\u7684\u6ce8\u89e3\n        AlipayCancelReturn alipayCancelReturn = (AlipayCancelReturn) xStream.fromXML(response);\n        log.info(alipayCancelReturn.toString());\n        return alipayCancelReturn;\n    }\n}<\/code><\/pre>\n<p>AlipayCreateReturn.java<\/p>\n<pre><code class=\"language-java\">import com.thoughtworks.xstream.annotations.XStreamAlias;\nimport com.thoughtworks.xstream.annotations.XStreamAsAttribute;\nimport com.thoughtworks.xstream.annotations.XStreamConverter;\nimport com.thoughtworks.xstream.annotations.XStreamImplicit;\nimport com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n@Data\n@NoArgsConstructor\n@XStreamAlias(&quot;alipay&quot;)\npublic class AlipayCreateReturn {\n\n    @XStreamAlias(&quot;is_success&quot;)\n    private String isSuccess;\n\n    @XStreamAlias(&quot;error&quot;)\n    private String error;\n\n    @XStreamAlias(&quot;request&quot;)\n    private Request request;\n\n    @XStreamAlias(&quot;response&quot;)\n    private Response response;\n\n    @XStreamAlias(&quot;sign_type&quot;)\n    private String signType;\n\n    private String sign;\n\n    @Data\n    @NoArgsConstructor\n    public static class Request {\n        @XStreamImplicit(itemFieldName = &quot;param&quot;)\n        private List&lt;Param&gt; param;\n    }\n\n    @Data\n    @NoArgsConstructor\n    @XStreamAlias(&quot;param&quot;)\n    @XStreamConverter(value = ToAttributedValueConverter.class, strings = {&quot;content&quot;})\n    public static class Param {\n        @XStreamAsAttribute\n        private String name;\n        private String content;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class Response {\n        @XStreamAlias(&quot;alipay&quot;)\n        private AlipayResponse alipayResponse;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class AlipayResponse {\n        @XStreamAlias(&quot;result_code&quot;)\n        private String resultCode;\n        @XStreamAlias(&quot;error&quot;)\n        private String error;\n        @XStreamAlias(&quot;detail_error_code&quot;)\n        private String detailErrorCode;\n        @XStreamAlias(&quot;detail_error_des&quot;)\n        private String detailErrorDes;\n        @XStreamAlias(&quot;display_message&quot;)\n        private String displayMessage;\n\n        @XStreamAlias(&quot;out_trade_no&quot;)\n        private String outTradeNo;\n        @XStreamAlias(&quot;qr_code&quot;)\n        private String qrCode;\n        @XStreamAlias(&quot;big_pic_url&quot;)\n        private String bigPicUrl;\n        @XStreamAlias(&quot;pic_url&quot;)\n        private String picUrl;\n        @XStreamAlias(&quot;small_pic_url&quot;)\n        private String smallPicUrl;\n        @XStreamAlias(&quot;voucher_type&quot;)\n        private String voucherType;\n    }\n}<\/code><\/pre>\n<p>AlipayRefundReturn.java<\/p>\n<pre><code class=\"language-java\">import com.thoughtworks.xstream.annotations.XStreamAlias;\nimport com.thoughtworks.xstream.annotations.XStreamAsAttribute;\nimport com.thoughtworks.xstream.annotations.XStreamConverter;\nimport com.thoughtworks.xstream.annotations.XStreamImplicit;\nimport com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n@Data\n@NoArgsConstructor\n@XStreamAlias(&quot;alipay&quot;)\npublic class AlipayRefundReturn {\n\n    @XStreamAlias(&quot;is_success&quot;)\n    private String isSuccess;\n\n    @XStreamAlias(&quot;error&quot;)\n    private String error;\n\n    @XStreamAlias(&quot;request&quot;)\n    private AlipayCreateReturn.Request request;\n\n    @XStreamAlias(&quot;response&quot;)\n    private Response response;\n\n    @XStreamAlias(&quot;sign_type&quot;)\n    private String signType;\n\n    private String sign;\n\n    @Data\n    @NoArgsConstructor\n    public static class Request {\n        @XStreamImplicit(itemFieldName = &quot;param&quot;)\n        private List&lt;Param&gt; param;\n    }\n\n    @Data\n    @NoArgsConstructor\n    @XStreamAlias(&quot;param&quot;)\n    @XStreamConverter(value = ToAttributedValueConverter.class, strings = {&quot;content&quot;})\n    public static class Param {\n        @XStreamAsAttribute\n        private String name;\n        private String content;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class Response {\n        @XStreamAlias(&quot;alipay&quot;)\n        private AlipayResponse alipayResponse;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class AlipayResponse {\n        @XStreamAlias(&quot;result_code&quot;)\n        private String resultCode;\n        @XStreamAlias(&quot;error&quot;)\n        private String error;\n        @XStreamAlias(&quot;detail_error_code&quot;)\n        private String detailErrorCode;\n        @XStreamAlias(&quot;detail_error_des&quot;)\n        private String detailErrorDes;\n        @XStreamAlias(&quot;display_message&quot;)\n        private String displayMessage;\n\n        @XStreamAlias(&quot;alipay_trans_id&quot;)\n        private String alipayTransId;\n        @XStreamAlias(&quot;currency&quot;)\n        private String currency;\n        @XStreamAlias(&quot;exchange_rate&quot;)\n        private String exchangeRate;\n        @XStreamAlias(&quot;partner_refund_id&quot;)\n        private String partnerRefundId;\n        @XStreamAlias(&quot;partner_trans_id&quot;)\n        private String partnerTransId;\n        @XStreamAlias(&quot;refund_amount&quot;)\n        private String refundAmount;\n        @XStreamAlias(&quot;refund_amount_cny&quot;)\n        private String refundAmountCny;\n    }\n}<\/code><\/pre>\n<p>AlipayQueryReturn.java<\/p>\n<pre><code class=\"language-java\">import com.thoughtworks.xstream.annotations.XStreamAlias;\nimport com.thoughtworks.xstream.annotations.XStreamAsAttribute;\nimport com.thoughtworks.xstream.annotations.XStreamConverter;\nimport com.thoughtworks.xstream.annotations.XStreamImplicit;\nimport com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n@Data\n@NoArgsConstructor\n@XStreamAlias(&quot;alipay&quot;)\npublic class AlipayQueryReturn {\n\n    @XStreamAlias(&quot;is_success&quot;)\n    private String isSuccess;\n\n    @XStreamAlias(&quot;error&quot;)\n    private String error;\n\n    @XStreamAlias(&quot;request&quot;)\n    private Request request;\n\n    @XStreamAlias(&quot;response&quot;)\n    private Response response;\n\n    @XStreamAlias(&quot;sign_type&quot;)\n    private String signType;\n\n    private String sign;\n\n    @Data\n    @NoArgsConstructor\n    public static class Request {\n        @XStreamImplicit(itemFieldName = &quot;param&quot;)\n        private List&lt;Param&gt; param;\n    }\n\n    @Data\n    @NoArgsConstructor\n    @XStreamAlias(&quot;param&quot;)\n    @XStreamConverter(value = ToAttributedValueConverter.class, strings = {&quot;content&quot;})\n    public static class Param {\n        @XStreamAsAttribute\n        private String name;\n        private String content;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class Response {\n        @XStreamAlias(&quot;alipay&quot;)\n        private AlipayResponse alipayResponse;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class AlipayResponse {\n        @XStreamAlias(&quot;result_code&quot;)\n        private String resultCode;\n        @XStreamAlias(&quot;error&quot;)\n        private String error;\n        @XStreamAlias(&quot;detail_error_code&quot;)\n        private String detailErrorCode;\n        @XStreamAlias(&quot;detail_error_des&quot;)\n        private String detailErrorDes;\n        @XStreamAlias(&quot;display_message&quot;)\n        private String displayMessage;\n\n        @XStreamAlias(&quot;alipay_buyer_login_id&quot;)\n        private String alipayBuyerLoginId;\n        @XStreamAlias(&quot;alipay_buyer_user_id&quot;)\n        private String alipayBuyerUserId;\n        @XStreamAlias(&quot;alipay_pay_time&quot;)\n        private String alipayPayTime;\n        @XStreamAlias(&quot;alipay_trans_id&quot;)\n        private String alipayTransId;\n        @XStreamAlias(&quot;alipay_trans_status&quot;)\n        private String alipayTransStatus;\n        @XStreamAlias(&quot;currency&quot;)\n        private String currency;\n        @XStreamAlias(&quot;exchange_rate&quot;)\n        private String exchangeRate;\n        @XStreamAlias(&quot;forex_total_fee&quot;)\n        private String forexTotalFee;\n        @XStreamAlias(&quot;out_trade_no&quot;)\n        private String outTradeNo;\n        @XStreamAlias(&quot;partner_trans_id&quot;)\n        private String partnerTransId;\n        @XStreamAlias(&quot;trans_amount&quot;)\n        private String transAmount;\n        @XStreamAlias(&quot;trans_amount_cny&quot;)\n        private String transAmountCny;\n        @XStreamAlias(&quot;trans_forex_rate&quot;)\n        private String transForexRate;\n\n    }\n}<\/code><\/pre>\n<p>AlipayCancelReturn.java<\/p>\n<pre><code class=\"language-java\">import com.thoughtworks.xstream.annotations.XStreamAlias;\nimport com.thoughtworks.xstream.annotations.XStreamAsAttribute;\nimport com.thoughtworks.xstream.annotations.XStreamConverter;\nimport com.thoughtworks.xstream.annotations.XStreamImplicit;\nimport com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n@Data\n@NoArgsConstructor\n@XStreamAlias(&quot;alipay&quot;)\npublic class AlipayCancelReturn {\n\n    @XStreamAlias(&quot;is_success&quot;)\n    private String isSuccess;\n\n    @XStreamAlias(&quot;error&quot;)\n    private String error;\n\n    @XStreamAlias(&quot;request&quot;)\n    private Request request;\n\n    @XStreamAlias(&quot;response&quot;)\n    private Response response;\n\n    @XStreamAlias(&quot;sign_type&quot;)\n    private String signType;\n\n    private String sign;\n\n    @Data\n    @NoArgsConstructor\n    public static class Request {\n        @XStreamImplicit(itemFieldName = &quot;param&quot;)\n        private List&lt;Param&gt; param;\n    }\n\n    @Data\n    @NoArgsConstructor\n    @XStreamAlias(&quot;param&quot;)\n    @XStreamConverter(value = ToAttributedValueConverter.class, strings = {&quot;content&quot;})\n    public static class Param {\n        @XStreamAsAttribute\n        private String name;\n        private String content;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class Response {\n        @XStreamAlias(&quot;alipay&quot;)\n        private AlipayResponse alipayResponse;\n    }\n\n    @Data\n    @NoArgsConstructor\n    public static class AlipayResponse {\n        @XStreamAlias(&quot;result_code&quot;)\n        private String resultCode;\n        @XStreamAlias(&quot;error&quot;)\n        private String error;\n        @XStreamAlias(&quot;detail_error_code&quot;)\n        private String detailErrorCode;\n        @XStreamAlias(&quot;detail_error_des&quot;)\n        private String detailErrorDes;\n        @XStreamAlias(&quot;display_message&quot;)\n        private String displayMessage;\n\n        @XStreamAlias(&quot;out_trade_no&quot;)\n        private String outTradeNo;\n        @XStreamAlias(&quot;retry_flag&quot;)\n        private String retryFlag;\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5f53\u5b58\u5728\u591a\u4e2a\u540c\u540dalias\u6ce8\u89e3\u7684Model\uff08\u5bf9\u5e94XML\u6839\u6807\u7b7e\u76f8\u540c\uff09\u65f6\uff0cXStream\u89e3\u6790\u4f1a\u4ea7\u751f\u51b2\u7a81\uff0c\u9700\u8981\u751f\u6210\u5404\u81ea [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[106],"class_list":["post-1396","post","type-post","status-publish","format-standard","hentry","category-java-basic","tag-xstream"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1396","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1396"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1396\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1396"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1396"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1396"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}