关于Java对象和XML之间的相互转换
最近参与的一个软件项目中,由于这个项目被划分为了几个子系统,并且需要和其他公司的系统进行交互,所以各个系统之间中定义了一系列的接口,接口都是基于XML格式的字符串,作为HTTP请求体,进行发送。
在项目中有两种场景需要进行XML和java对象之间转换:
1、在两个系统之间同步数据
使用这种方式进行交互时,发送方生成xml,然后向接收方发送http请求,接收方收到后,解析xml,并返回xml格式的响应。
在处理这种消息接口时,项目使用了JAXB注解的方式来处理xml和java对象之间的转换。
使用JAXB有几个优点:
1)类的复用
javaBean按照xml格式配置好JAXB注解后,发送方生成xml和接收方解析xml都可以使用同一个java对象。
2)简单明了
简化了工作量,开发简单
2、转换消息格式
系统A需要通过系统B与系统C进行通信,这个时候,系统B需要把来自系统A的消息进行转换,转换成系统C能够接受的消息格式。
在这个过程的处理中,我分别使用了FreeMarker模板技术和Digester技术。
首先,系统B处理系统A的消息,我使用了Digester技术,把Xml转换成java对象;然后,使用FreeMarker模板,把java对象转换成xml发送给系统C。
为什么这里不使用JAXB呢?因为这里面不需要把一个xml转换成java对象,然后再把这个java对象转换成相同的xml,如果是这样,就没有必要有系统B了,B系统的角色是一个适配器,可以把系统A的消息转换成任何其他系统的消息格式,并且系统A不必了解其他系统的消息格式。
使用FreeMarker生成xml非常简单,和编写jsp类似,只不过这里是.ftl文件。ftl文件里面写好你的xml,把变化的数据用变量名替换,然后在Servlet或Action里面准备好数据,就可以生成xml了。记住模板+数据=输出(xml);
Digester是使用SAX方式来解析xml,可以以任意路径来生成对象,非常方便。