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 处理多个并列属性
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);