使用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);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2022-03-30 10:24  BBS_自律  阅读(426)  评论(0)    收藏  举报