• 使用XStream实现Java对象与XML互相转换


    1.需求对接第三方 http post请求 请求报文中message字段 是xml格式;接口返回信息也是xml

      1.1 请求xml

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <com.ctc.ema.server.jwsserver.sms.MtMessage>
    <content>sms test</content>
    <phoneNumber>15001710000</phoneNumber>
    <phoneNumber>15001710008</phoneNumber>
    <phoneNumber>15001710009</phoneNumber>
    </com.ctc.ema.server.jwsserver.sms.MtMessage>

      1.2 返回xml

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <com.ctc.ema.server.jwsserver.sms.MtMessageRes>
    <resDetail>
    <phoneNumber>15001710000</phoneNumber>
    <stat>r:000</stat>
    <statDes>提交成功</statDes>
    </resDetail>
    <resDetail>
    <phoneNumber>15001710008</phoneNumber>
    <stat>r:000</stat>
    <statDes>提交成功</statDes>
    </resDetail>
    <resDetail>
    <phoneNumber>15001710009</phoneNumber>
    <stat>r:000</stat>
    <statDes>提交成功</statDes>
    </resDetail>
    <smsId>4acadda1-5806-4492-9a82-b7ab3f1c8ec0</smsId><subStat>r:000</subStat>
    <subStatDes>处理成功</subStatDes>
    </com.ctc.ema.server.jwsserver.sms.MtMessageRes>

    2.尝试使用 Xstream的方式 将java对象与xml进行相互转换

     3. 转 https://segmentfault.com/a/1190000012435867 

    未实现全部功能 比如并列list 如何展示,比如xml头如何处理

      3.1 XStream实现Java对象到xml的相互转换  解决了xml头的问题 经测试不用处理

    4.难点是xml 报文中 phoneNumber 该字段是不确定个数的

    http://www.blogjava.net/bolo/archive/2014/08/26/417353.html

      // 隐式集合,加上这个注解可以去掉book集合最外面的<list></list>这样的标记
        @XStreamImplicit
        private List<Book> list;

    5.搜索 XStream java对象转xml 处理多个并列属性

    6. XStream 转换 List<String>的方法

    7. 例子

       7.1 引入依赖

    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.10</version>
    </dependency>

       7.2  XmlUtils 工具类

    package com.ins.mesrabbitmq.common.util;
    
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.DomDriver;
    
    /**
     * TODO
     *
     * @author zhaoJs
     * @version 1.0
     * @date 2022/3/30 16:58
     */
    public class XmlUtils {
    
        /**
         * XML转对象
         * @param clazz 对象类
         * @param str xml字符串
         * @param <T> T
         * @return
         */
        public static <T> T parseFromXml(Class<T> clazz, String xml) {
            //创建解析XML对象
            XStream xStream = new XStream(new DomDriver());
            // 设置安全权限
            XStream.setupDefaultSecurity(xStream);
            // 设置可转换类型
            xStream.allowTypes(new Class[] {clazz});
    
            //处理注解
            xStream.processAnnotations(clazz);
            @SuppressWarnings("unchecked")
            //将XML字符串转为bean对象
            T t = (T)xStream.fromXML(xml);
            return t;
        }
    
        /**
         * 对象转xml
         * @param obj 对象
         * @return
         */
        public static String toXml(Object obj) {
            XStream xStream = new XStream(new DomDriver());
            xStream.processAnnotations(obj.getClass());
            return xStream.toXML(obj);
        }
    }

      7.3 实体类 转 xml

    package com.ins.mesrabbitmq.consumer.dto;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamImplicit;
    import lombok.Data;
    
    import java.util.List;
    
    /**
     *  请求报文转xml
     *
     * @author zhaoJs
     * @version 1.0
     * @date 2022/3/30 16:57
     */
    @Data
    @XStreamAlias("com.ctc.ema.server.jwsserver.sms.MtMessage")
    public class DahantricomReq {
        @XStreamAlias("content")
        private String content;
        
       
    // XStreamImplicit 隐式集合,加上这个注解可以去掉String集合最外面的<list></list>这样的标记
        @XStreamImplicit(itemFieldName ="phoneNumber")
        private List<String> phoneNumber;
        
        
    }

      7.4 测试 结果

      

        public static void main(String[] args) {
           
            ArrayList<String> phonelist = new ArrayList<>();
            phonelist.add("15001710000");
            phonelist.add("15001710001");
            phonelist.add("15001710002");
            phonelist.add("15001710003");
     
    
            DahantricomReq req = new DahantricomReq();
            req.setContent("sms test");
            req.setPhoneNumber(phonelist);
            String xml = XmlUtils.toXml(req);

     8. XML转实体类

      8.1 实体类  DahantricomRes

    package com.ins.mesrabbitmq.consumer.dto;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamImplicit;
    import lombok.Data;
    
    import java.util.List;
    
    /**
     * 响应报文 xml 转实体类
     *
     * @author zhaoJs
     * @version 1.0
     * @date 2022/3/30 16:57
     */
    @Data
    @XStreamAlias("com.ctc.ema.server.jwsserver.sms.MtMessageRes")
    public class DahantricomRes {
        // 隐式集合,加上这个注解可以去掉ResDetail集合最外面的<list></list>这样的标记
        @XStreamImplicit()
        private List<ResDetail> resDetail;
    
        @XStreamAlias("smsId")
        private String smsId;
    
        @XStreamAlias("subStatDes")
        private String subStatDes;
    
        @XStreamAlias("subStat")
        private String subStat;
        
        
        
    
    }

      8.1.2 实体类 ResDetail

    package com.ins.mesrabbitmq.consumer.dto;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import lombok.Data;
    
    /**
     * TODO
     *
     * @author zhaoJs
     * @version 1.0
     * @date 2022/3/30 18:20
     */
    @Data
    @XStreamAlias("resDetail")
    public class ResDetail {
        @XStreamAlias("phoneNumber")
        private String phoneNumber;
        @XStreamAlias("stat")
        private String stat;
        @XStreamAlias("statDes")
        private String statDes;
    }

      8.2 main测试

       public static void main(String[] args) {
           
     
            
             String resXmlTrue = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                     "<com.ctc.ema.server.jwsserver.sms.MtMessageRes>\n" +
                     "<resDetail>\n" +
                     "<phoneNumber>15001710000</phoneNumber>\n" +
                     "<stat>r:000</stat>\n" +
                     "<statDes>提交成功</statDes>\n" +
                     "</resDetail>\n" +
                     "<resDetail>\n" +
                     "<phoneNumber>15001710008</phoneNumber>\n" +
                     "<stat>r:000</stat>\n" +
                     "<statDes>提交成功</statDes>\n" +
                     "</resDetail>\n" +
                     "<resDetail>\n" +
                     "<phoneNumber>15001710009</phoneNumber>\n" +
                     "<stat>r:000</stat>\n" +
                     "<statDes>提交成功</statDes>\n" +
                     "</resDetail>\n" +
                     "<smsId>4acadda1-5806-4492-9a82-b7ab3f1c8ec0</smsId><subStat>r:000</subStat>\n" +
                     "<subStatDes>处理成功</subStatDes>\n" +
                     "</com.ctc.ema.server.jwsserver.sms.MtMessageRes>";
            DahantricomRes dahantricomRes = XmlUtils.parseFromXml(DahantricomRes.class, resXmlTrue);
            System.out.printf("dahantricomReqT:"+dahantricomRes.toString());

        String toJSONString = JSON.toJSONString(dahantricomRes);
        System.out.printf("dahantricomRes:"+toJSONString);

     
     
     
     
     
     

     
  • 相关阅读:
    python_07
    python_01
    python_06
    JDBC批处理
    JDBC处理大数据
    利用PreparedStatement预防SQL注入
    利用工厂模式实现serviec层和dao层解耦
    jdbc入门
    EL表达式详解
    购物车案列
  • 原文地址:https://www.cnblogs.com/nextgg/p/16075730.html
Copyright © 2020-2023  润新知