其他分享
首页 > 其他分享> > JAXB常用注解讲解(超详细)

JAXB常用注解讲解(超详细)

作者:互联网

简介:

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

一个简单的例子

Person.class类

package io.renren.modules.temptest;

import lombok.Data;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author xubo
 * @ClassNme Person
 * @Description TODO
 * @Date 2022-03-30 17:03:29
 * @version1.0
 */
@Data
@XmlRootElement //关于这个注解稍后会有解释
public class Person {

    private int id;
    private String name;
    private String gender;
    private String addr;
    private String area;

    public Person() {
    }

    public Person( String name, String gender, String addr, String area) {//这里没有id

        this.name = name;
        this.gender = gender;
        this.addr = addr;
        this.area = area;
    }



}

JAXBTest.class类:

package io.renren.modules.temptest;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;

/**
 * @author xubo
 * @ClassNme JAXBTest
 * @Description TODO
 * @Date 2022-03-30 17:08:26
 * @version1.0
 */

public class JAXBTest {

    //对象转xml
    public void generateXML() {
        Person person = new Person("abc", "男", "北京", "朝阳区");

        File file = new File("D:\\person.xml");
        JAXBContext jc = null;
        try {
            //根据Person类生成上下文对象
            jc = JAXBContext.newInstance(Person.class);
            //从上下文中获取Marshaller对象,用作将bean编组(转换)为xml
            Marshaller ma = jc.createMarshaller();
            //以下是为生成xml做的一些配置
            //格式化输出,即按标签自动换行,否则就是一行输出
            ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            //设置编码(默认编码就是utf-8)
            ma.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            //是否省略xml头信息,默认不省略(false)
            ma.setProperty(Marshaller.JAXB_FRAGMENT, false);

            //编组
            ma.marshal(person, file);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }


    //xml转对象
    public void generateBean() {
        File file = new File("D:\\person.xml");
        JAXBContext jc = null;
        try {
            jc = JAXBContext.newInstance(Person.class);
            Unmarshaller uma = jc.createUnmarshaller();
            Person person = (Person) uma.unmarshal(file);
            System.out.println(person);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }



}

Test.class类:

package io.renren.modules.temptest;

/**
 * @author xubo
 * @ClassNme Test
 * @Description TODO
 * @Date 2022-03-30 17:52:48
 * @version1.0
 */
public class Test {
    public static void main(String[] args){
        JAXBTest jaxbTest = new JAXBTest();
        //对象转xml
        jaxbTest.generateXML();

        //xml转对象
        jaxbTest.generateBean();

    }

}

测试结果:

运行方法:generateXML():

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <addr>北京</addr>
    <area>朝阳区</area>
    <gender>男</gender>
    <id>0</id>
    <name>abc</name>
</person>

此xml相当于该xsd文件:

<xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="addr" minOccurs="0"/>
        <xs:element type="xs:string" name="area" minOccurs="0"/>
        <xs:element type="xs:string" name="gender" minOccurs="0"/>
        <xs:element type="xs:int" name="id" minOccurs="0"/>
        <xs:element type="xs:string" name="name" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

运行方法:generateBean():

 

 

是不是很方便?这只是一个最简单的小例子,下文会在这个例子的基础上介绍和讲解其他的一些常用JAXB注解。因为会使用到部分xsd的知识,不了解的读者可以看我另一篇博客:《xsd学习:超详细解析》,否则下文会有些理解困难。

注:从jdk1.7开始,JAXB就对解组和编组的方法进行了更简单的封装,所以实际项目中除非自己要进行个性化设置,否则大可不用自己再创建JAXBContext实例,直接通过JAXB静态调用相应的工具方法就行了,于是上面的测试方法可以写的更简练些:

下面为了测试方便,还是在JAXBTest类中写了两个静态方法,运行后结果还是一样的。代码看起来更加简洁,这只是简单的功能。

package io.renren.modules.temptest;

import javax.xml.bind.JAXB;
import java.io.File;

/**
 * @author xubo
 * @ClassNme Test
 * @Description TODO
 * @Date 2022-03-30 17:52:48
 * @version1.0
 */
public class Test {
    public static void main(String[] args){
//        JAXBTest jaxbTest = new JAXBTest();
//        //对象转xml
//        jaxbTest.generateXML();
//
//        //xml转对象
//        jaxbTest.generateBean();


        generateXML1();

        generateBean1();
    }



     //为了测试方便使用静态
        public static void generateXML1() {
            Person person = new Person("abc", "男", "北京", "朝阳区");
            File file = new File("D:\\person1.xml");
            JAXB.marshal(person, file);
        }

     
        public static void generateBean1() {
            File file = new File("D:\\person1.xml");
            Person person = JAXB.unmarshal(file, Person.class);

            System.out.println(person);
        }


}

结果显示:上面修改了生成文件名名字person1.xml

运行generateXML1()方法

运行generateBean1()方法

 

 

 

 直接使用默认的配置,已经足够应付大多数情况,读者可以试一下。

常用注解:

@XmlRootElement:

作用和用法:

类级别的注解,将类映射为xml全局元素,也就是根元素。就像spring配置文件中的beans。上面的例子中我将该注解用在了person类上,生成了<person>根元素。常与@XmlType,@XmlAccessorType,@XmlAccessorOrder连用。

属性:

该注解含有name和namespace两个属性。namespace属性用于指定生成的元素所属的命名空间。name属性用于指定生成元素的名字,若不指定则默认使用类名小写作为元素名。修改上面的例子,在该注解上使用name,namespace属性:

package io.renren.modules.temptest;

import lombok.Data;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author xubo
 * @ClassNme Person
 * @Description TODO
 * @Date 2022-03-30 17:03:29
 * @version1.0
 */
@Data
@XmlRootElement(name = "xubo" , namespace = "www.baidu.com")
public class Person {

    private int id;
    private String name;
    private String gender;
    private String addr;
    private String area;

    public Person() {
    }

    public Person( String name, String gender, String addr, String area) {//这里没有id

        this.name = name;
        this.gender = gender;
        this.addr = addr;
        this.area = area;
    }
}

重新运行方法generateXML1(),可以看到根元素变名字了,注意根元素跟之前不一样了,多了ns2

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:xubo xmlns:ns2="www.baidu.com">
<addr>北京市</addr>
<area>朝阳区潘家园</area>
<gender>男</gender>
<id>0</id>
<name>abccc</name>
</ns2:xubo>

 

 

 

 

 

 

 

generateBean1

标签:xml,String,JAXB,Person,讲解,注解,public,name
来源: https://www.cnblogs.com/javaxubo/p/16078514.html