JAXB 实现 XML & JAVABEAN 的转换

一 前言

集成接口项目的开发,与第三方系统或中间平台等进行交互,支持服务端&客户端,支持 http/ https/ Webservice 等多种交互方式,数据传输主要采用XML(部分可能会在XML中以<![CDATA[......]]> 的形式包裹 JSON字符串),以后也可能会采用 JSON 格式。鉴于功能需要,必然要将XML传输的数据转换为JAVA对象来进行数据的处理,以及将JAVA对象转换为XML作为报文进行传输,因此,给出以下方案:利用JAXB技术来实现JAVA对象与XML的自由转换,以及对<![CDATA[......]]> 内容的处理。

根据业务与需求的复杂程度,本文中所列解决方案不能全部覆盖,因此会在今后进行补充。


二 JAXB概述

JAXB(Java Architecture for XML Binding) 是一个业界标准,是可根据XML Schema产生Java类的技术。同时,JAXB不仅提供了将XML反向生成Java对象树的方法,而且能将Java对象树重新写到 XML文档,实现Java对象与XML的互相转换
      Jaxb
2.0是JDK 1.6的组成部分,无需引入第三方jar包。Jaxb2.0使用了JDK的新特性,如:Annotation、泛型(GenericType
 
重要
概念:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
 

常用注解(annotation):
@XmlType,将Java类或枚举类型映射到XML Schema Type
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(non-static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE 等。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。

@XmlTransient

1.@XmlType
  @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用;

它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

@XmlType(name = "basicStruct", propOrder = { "intValue","stringArray","stringValue")
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

若同时使用了@XmlType(propOrder={})和 @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)的时候,生成的XML只会按照propOrder定义的顺序生成元素

2.@XmlRootElement
  @XmlRootElement用于类级别的注解,对应XML的根元素,常与 @XmlType 和 @XmlAccessorType一起使用;

若制定属性name,则会指定其在XML中的显示的名称,如:
  @XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement(name="ADDRESS_INFO")
  public class Address {......}

3.@XmlElement
  @XmlElement将java对象的属性映射为XML的节点,在使用@XmlElement时,可通过name属性改变java对象属性在XML中显示的名称。如:
  @XmlElement(name="ADDRESS")  
  private String yourAddress;

4.@XmlAttribute
  @XmlAttribute用于把java对象的属性映射为XML的属性,并可通过name属性为生成的xml属性指定别名。如:
  @XmlAttribute(name="state_name")
  private String state;
 
5.@XmlAccessorType
  @XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分别为:

  • XmlAccessType.FIELD: java对象中的所有non-static/没有被@XmlTransient注解的成员变量
  • XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
  • XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
  • XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素

注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlE

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值