您的位置:首页 > 其它

从JAXB的应用实例看JAXB的实用性

2010-04-08 15:47 239 查看
最近在看有关JAXB的文章,文章中都选了一两个例子来说明JAXB功能的强大,从单个功能来说它确实验证了它具有的功能和特性。典型的文章如《一个实例看JAXB的强大》(http://zyl.javaeye.com/blog/33729)。我根据其中所述搭建了应用环境如下:
1、先安装一个jdk1.6.0_18,配置好环境,因为要用/bin/xjc.exe生成xml映射对象
2、根据上面文章中提供的资料产生customer.xml,customer.xsd,customer.jxb
3、制作一个ant文件生成xml映射对象
<?xml version="1.0"?>
<project name="xjc" basedir=".">
<property name="xjc.home" location="." />
<property name="jdk.dir" location="D:/Java/jdk1.6.0_18" />
<path id="cxf.classpath">
<fileset dir="${xjc.home}/lib">
<include name="*.jar" />
</fileset>
</path>
<target name="xjc" description="translate xsd to java">
<exec executable="${jdk.dir}/bin/xjc.exe">
<arg value="-d" />
<arg value="./src" />
<arg value="-b" />
<arg value="./customer.jxb" />
<arg value="./customer.xsd" />
</exec>
</target>
</project>
接下来在项目中将产生一个类似这样的目录
com.demo.customer.
AddressBo.java
CustomerBo.java
ObjectFactory.java
测试文件如下:
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Test t = new Test();
t.test1();
} catch (Exception e) {
e.printStackTrace();
}
}

public void test1() throws Exception {
// 主要的环境类,主要读取ObjectFactory这个类,这是由xjc生成的。
JAXBContext jc = JAXBContext.newInstance("com.demo.customer");
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<CustomerBo> customerE = (JAXBElement<CustomerBo>) u.unmarshal(new FileInputStream(
"customer.xml"));
CustomerBo cust = (CustomerBo) customerE.getValue();

System.out.println(cust.getId());
System.out.println(cust.getName());
System.out.println(cust.getAddress().getCity());
System.out.println(cust.getAddress().getStreet());
System.out.println(cust.getAddress().getZip());

//JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
customerE.setValue(cust);
marshaller.marshal(customerE, new FileOutputStream("test1.xml"));

}
}
测试运行成功,得到了我们想要的东西,jaxb可以xml映射对象,也可以对象生成xml。

好了,接下来才是我要论述的重点。我们从系统整合的角度来思考如何应用JAXB。单个独立的系统,如果不需要和其他系统交互,我们可以不使用JAXB,即使只用POJO,也可以满足我们对数据结构的需要。但是对于交互系统,远远满足不了,就可以引入JAXB了。

假设现在我们有三个相互依赖的应用系统,一个是客户关系管理系统,一个信贷系统,一个是征信系统,信贷系统是新开发的系统,而另外两个是早期开发的。他们之间数据需要相互共享,在审核信贷时需要查看客户资料和他的信用级别,没有的需要增加等。那他们之间简单的关系就是:
客户关系管理系统<---1-->信贷系统<----2---->征信系统
1、需要交互客户数据等
2、个人或企业的信用数据等

由于前期开发的系统比较早,重要的信息一般都会将他们持久化到数据库,接口都已经开发好了,不太可能引入太多的新技术和增加过量的接口,那从选择的角度来看用xml交换数据是一个比较折中的方案,当然也可以用socket字符流等,但对信贷系统来说继续用它技术就相对落后了。信贷系统按照当前的发展方向选择的方式比较多,soap,wsdl,xml等等都可以的。soap,wsdl是面向未来的系统,但是为了和过去的系统耦合,其至少需要提供xml交换数据的方式,它是行业的标准。

前期的系统大多采用DAO方式开发的,各类接口(主要是指映射表数据的接口)之间层次比较明显。如果引入JAXB对系统而言就需要升级JAVA版本,引入更多的包,并按照上述的方式产生新的接口并覆盖前期开发的交换信息的接口,在前期开发的接口上增加映射元素注释,但不影响接口的调用。这样的方式对于一个稳定的系统来说,技术方案完全能够实现,且融进了新的开发技术,可以为以后提供更好交互数据的解决方案,一次升级成功后,其提供的交换数据接口就是标准的,未来的系统必须主动去适应它。但对于非技术的信管领导来说,风险还是无法接受的,改进力度太大了。最后选择的方式只能是通过DOM方式将java对象映射成XML流进行数据交换,面对不同的交互场景,每次都需要进行一次增量开发,对原有系统的影响非常少,但是闹腾人,每次需求来了,你都需要重新开发。

如果前期的系统数据库映射也是采用hiberate,jpa,ejb3等方式,那面临着和信贷系统一样需要考虑的问题。因为这些方式都可由由工具自动产生映射接口,且在同一个包中。同样由xjc产生的ObjectFactory无论针对哪一个映射都会产生一个,由于ObjectFactory提供了非常重要的信息,在编组和解析xml时都需要应用到它,你无法回避它,那也就意味着你至少部分放弃自动映射工具为你提供的周到服务。接下来你有几种选择方案:
1、首先用自动映射工具产生接口,然后手工将产生的每一接口分类到每个包中,然后再用xjc产生需要xml2java之间的接口。如果映射的方式也是采用注释的形式,需要考虑他们之间是否会形成干扰。
2、继续使用自动映射工具产生所有接口,然后用xjc产生需要xml2java之间的接口,这样就会出现接口中字段内容完全一致,但是因为接口的名字不一样,而导致接口不能互用,需要转化。

3、做一个非常庞大的XSD,JXB绑定文件,所有xml2java接口都定义在其中,这样维护它们成为一件困难的事情。

综合上面的疑虑,且由于JAXB将成为标准,列入JDK开发包中,如果这些问题不解决,还是会给开发者带来不便,甚至弃用它,而选择别的开源项目,如castor,JBind等(文章:http://www.ibm.com/developerworks/cn/xml/x-databdopt/part1/index.html)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: