最近在做的这个项目(对接银行),请求过来的报文格式为XML,解析方式也一直用的是XStream。在用的过程中发现其特点,转换成JavaBean很方便。
都开发完了,测试的时候,银行反馈一直报节点错误,导致测试进度进行不下去。(当时心想按你们接口文档开发的,你们请求过来的报文和接口文档不一致,还怪谁。)但是问题还是要解决的,安抚内心的小情绪,给他们沟通为什么会导致这种情况。
了解后发现,银行没有统一的接口文档(或者是没有固定的接口文档),听到这个消息我震惊了,对接了那么多家银行,怎么会有银行这么奇葩。银行方面的解释是,他们对接很多家保险公司,每一家保险公司又需求变更的话,银行方面都会修改字段(变更比较频繁)。而银行就会把修改后的报文信息一股脑的给到各家对接的保险公司。而各个保险公司都会接收他们的报文,然后从中取到他们需要的字段。
XStream解析,报文中的字段少是可以正常解析的,但是字段多的话就不能正常解析了。那这种方式就会解析不了他们的报文。怎么办呢,改吧。银行爸爸不会为一家保险公司定制一套报文,那样成本会高很多。
扒拉一下代码,把XStream转DTO的那段代码注释掉,新起一个方法,用了Dom4j解析请求过来的报文,只去取自己用到字段。改起来还是很快的,然后继续测试,没有延误工期。
原来的方式,就是我建了一个门(这个规则由我制定),你的长度和宽度(内容)只能小于等于我的门的规格,你(数据)才能进来。
另一种方式呢,就相当于你有你和家人有一大堆旧衣服,然后你家的穷亲戚都来了,他们需要穿多大的衣服自己知道,然后就去这堆衣服里面去扒拉,找到自己能穿的衣服,然后走了。(这个比喻可能不太恰当,大致就是这个意思。)
刚开始进行修改的时候心里可能还有一点不忿。自己一直都是个很怂的人,即使抱怨也不会让别人听见,别人就以为我没意见。但是从技术角度上分析,假如说遇到一个问题,领导比较强势,直接让对接的合作方去改,去适应你。你可能不会多另一个视角去看待一个问题。但是谁又不想靠个大树好乘凉呢。
具体的XStream和Dom4j解析XML的细节和怎样操作的内容,请参考下面的一篇博客,里面有详细的讲解,一看就能上手
https://blog.csdn.net/thunder09/article/details/5555946
-------------------------------------------这是一个洗心革面的分界线---------------------------------------------------------
昨天刚写的,今天就被打脸。还好0访问量,赶紧把评论加上,
XStream可以忽略多节点的情况。
XStream老版本可能没有这个函数(应该是1.4.5以上版本)
ignoreUnknownElements();
ignoreUnknownElements(String pattern);
在XStream解析报文的时候,只要加上ignoreUnknownElements(); 这句,无论是多节点还是少节点都能够解析。
上代码,新建一个实体类,四个属性,先打印出来报文。去掉一个属性的节点,再加上原来没有的节点也能正常解析。
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("dog")
public class dog {
private String name;
private String age;
private String color;
private String clothes;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getClothes() {
return clothes;
}
public void setClothes(String clothes) {
this.clothes = clothes;
}
}
import com.sinosoft.light.dataswitch.service.model.tpain.LisCallResponseDTO;
import com.thoughtworks.xstream.XStream;
public class TestDogXml {
public static void main(String[] args) {
dog Ahuang = new dog();
Ahuang.setAge("2");
Ahuang.setColor("Yellow");
Ahuang.setName("阿黄");
XStream xstream = new XStream();
xstream.processAnnotations(dog.class);
System.out.println("打印阿黄的报文:" + xstream.toXML(Ahuang));
String reqXml = "\n" +
" 阿黄 \n" +
" 2 \n" +
" Yellow \n" +
" YYY \n" +
" ";
xstream.ignoreUnknownElements();
Object objs = xstream.fromXML(reqXml);
dog resDod = (dog) objs;
System.out.println("名字:" + resDod.getName());
}
}
可以正常解析,打印结果如下:
打印阿黄的报文:
名字:阿黄
由此可见,可以正常解析。
想想原来改用dom4j解析的时候,如果知道一行代码可以解决的时候,我还会做那么多的无用功嘛。
这次真的是明白了 知识就是力量,拥有知识,可以节省你的时间,遇到问题能最高效的处理问题。