当前位置: 移动技术网 > IT编程>开发语言>Java > JAXB简介_动力节点Java学院整理

JAXB简介_动力节点Java学院整理

2019年07月19日  | 移动技术网IT编程  | 我要评论

一、jaxb是什么 

    jaxb是java architecture for xml binding的缩写。可以将一个java对象转变成为xml格式,反之亦然。 
    我们把对象与关系数据库之间的映射称为orm,其实也可以把对象与xml之间的映射称为oxm(object xml mapping)。原来jaxb是java ee的一部分,在jdk1.6中,sun将其放到了java se中,这也是sun的一贯做法。jdk1.6中自带的这个jaxb版本是2.0,比起1.0(jsr 31)来,jaxb2(jsr 222)用jdk5的新特性annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。 

二、jaxb应用模式 

    在java ee 5\6中,jaxb可以很方便的与jax-rs、jax-ws集成,极大的简化了web service接口的开发工作量。 

三、jaxb代码举例 

首先定义两个示例类classa,classb,用于后续的示例演示

package com.bjpowernode.test;

public class classa {
  private int classaid;
  private string classaname;

  private classb classb;

  public int getclassaid() {
    return classaid;
  }

  public void setclassaid(int classaid) {
    this.classaid = classaid;
  }

  public string getclassaname() {
    return classaname;
  }

  public void setclassaname(string classaname) {
    this.classaname = classaname;
  }

  public classb getclassb() {
    return classb;
  }

  public void setclassb(classb classb) {
    this.classb = classb;
  }
}
package com.bjpowernode.test;

public class classb {
  private int classbid;
  private string classbname;

  public int getclassbid() {
    return classbid;
  }

  public void setclassbid(int classbid) {
    this.classbid = classbid;
  }

  public string getclassbname() {
    return classbname;
  }

  public void setclassbname(string classbname) {
    this.classbname = classbname;
  }
}

用于序列化的xmlutil

package com.bjpowernode.test;

import java.io.stringreader;
import java.io.stringwriter;

import javax.xml.bind.*;

public class xmlutil {

  public static string toxml(object obj) {
    try {
      jaxbcontext context = jaxbcontext.newinstance(obj.getclass());

      marshaller marshaller = context.createmarshaller();
      marshaller.setproperty(marshaller.jaxb_encoding, "utf-8");// //编码格式
      marshaller.setproperty(marshaller.jaxb_formatted_output, true);// 是否格式化生成的xml串
      marshaller.setproperty(marshaller.jaxb_fragment, false);// 是否省略xm头声明信息
      stringwriter writer = new stringwriter();
      marshaller.marshal(obj, writer);
      return writer.tostring();
    } catch (exception e) {
      throw new runtimeexception(e);
    }
  }

  @suppresswarnings("unchecked")
  public static <t> t fromxml(string xml, class<t> valuetype) {
    try {
      jaxbcontext context = jaxbcontext.newinstance(valuetype);
      unmarshaller unmarshaller = context.createunmarshaller();
      return (t) unmarshaller.unmarshal(new stringreader(xml));
    } catch (exception e) {
      throw new runtimeexception(e.getmessage());
    }
  }
}

调用如下:

package com.bjpowernode.test;

public class mainrun {

  /**
   * @param args
   */
  public static void main(string[] args) {

    classb classb = new classb();
    classb.setclassbid(22);
    classb.setclassbname("b2");

    classa classa = new classa();
    classa.setclassaid(11);
    classa.setclassaname("a1");
    classa.setclassb(classb);

    system.out.println(xmlutil.toxml(classa));
  }

}

输出结果如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<classa>
  <classaid>11</classaid>
  <classaname>a1</classaname>
  <classb>
    <classbid>22</classbid>
    <classbname>b2</classbname>
  </classb>
</classa>

这里要注意以下几点

1.要序列化的类加上 @xmlrootelement注解,否则会报错(错误提示很清晰,这里就不贴出来了)
2.jaxb序列化xml时  默认序列化getter和setter,且getter和setter必须成对出现才会被序列化
3.属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @xmlelement(name="classaid") 指定名称,这里要注意的是@xmlelement放置在getter或setter上都行,但只能放一个,也就是说不能同时在getter和setter上使用@xmlelement注解
4.如何控制根节点名称?
使用@xmlrootelement指定name属性即可,如@xmlrootelement(name="classa")
5.怎么添加命名空间
使用@xmlrootelement(namespace="com.bjpowernode.test") 指定namespace属性
6.怎么精确控制每个属性名称
jaxb自动转化为首字母小写会导致不可预料的属性名称出现, 不嫌麻烦的话为每个属性设置@xmlelement(name=""),想省事的话使用field
7.怎么样实现序列化时使用field字段而不是使用setter和getter
在要使用的类上面加上@xmlaccessortype(xmlaccesstype.field)注解,并指定为xmlaccesstype.field,这里强烈推荐使用@xmlaccessortype(xmlaccesstype.field)注解,因为这样你可以精确的控制每个元素的名称,而不需要为每个属性去设置@xmlelement(name="")注解,当然也可以在field上使用@xmlelement注解
下面给出使用了使用如上注解后的代码示例

@xmlrootelement(namespace="com.bjpowernode.test")
@xmlaccessortype(xmlaccesstype.field)
public class classa {
  private int classaid;
  
  @xmlelement(name="classaname")
  private string classaname;

  private classb classb;

  public int getclassaid() {
    return classaid;
  }
  public void setclassaid(int classaid) {
    this.classaid = classaid;
  }

  public string getclassaname() {
    return classaname;
  }

  public void setclassaname(string classaname) {
    this.classaname = classaname;
  }

  public classb getclassb() {
    return classb;
  }

  public void setclassb(classb classb) {
    this.classb = classb;
  }
}

@xmlrootelement
@xmlaccessortype(xmlaccesstype.field)
public class classb {
  private int classbid;
  private string classbname;

  public int getclassbid() {
    return classbid;
  }

  public void setclassbid(int classbid) {
    this.classbid = classbid;
  }

  public string getclassbname() {
    return classbname;
  }

  public void setclassbname(string classbname) {
    this.classbname = classbname;
  }
}

输出xml为

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns2:classa xmlns:ns2="com.bjpowernode.test">
  <classaid>11</classaid>
  <classaname>a1</classaname>
  <classb>
    <classbid>22</classbid>
    <classbname>b2</classbname>
  </classb>
</ns2:classa>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网