# JAXB 注解

> 原文： [https://howtodoinjava.com/jaxb/jaxb-annotations/](https://howtodoinjava.com/jaxb/jaxb-annotations/)

详细了解 **JAXB 注解**及其在编组和解组操作期间的用法。

## 1）JAXB 注释列表

| 注解 | 范围 | 描述 |
| --- | --- | --- |
| [`@XmlRootElement`](#XmlRootElement) | 类，枚举 | 定义 XML 根元素。 根 Java 类在创建时需要在 JAXB 上下文中注册。 |
| [`@XmlAccessorType`](#XmlAccessorType) | 包，类 | 定义 JAXB 引擎用于绑定的 Java 类的字段和属性。 它具有四个值：`PUBLIC_MEMBER`，`FIELD`，`PROPERTY`和`NONE`。 |
| [`@XmlAccessorOrder`](#XmlAccessorOrder) | 包，类 | 定义子项的顺序。 |
| [`@XmlType`](#XmlType) | 类，枚举 | 将 Java 类映射到架构类型。 它定义了其子类型的名称和顺序。 |
| [`@XmlElement`](#XmlElement) | 字段 | 将字段或属性映射到 XML 元素 |
| [`@XmlAttribute`](#XmlAttribute) | 字段 | 将字段或属性映射到 XML 属性 |
| [`@XmlTransient`](#XmlTransient) | 字段 | 防止将字段或属性映射到 XML 模式 |
| [`@XmlValue`](#XmlValue) | 字段 | 将字段或属性映射到 XML 标记上的文本值。 |
| [`@XmlList`](#XmlList) | 字段，参数 | 将集合映射到以空格分隔的值列表。 |
| [`@XmlElementWrapper`](#XmlElementWrapper) | 字段 | 将 Java 集合映射到 XML 包的集合 |

> 阅读更多：[将 Java 对象转换为 XML](https://howtodoinjava.com/jaxb/write-object-to-xml/)

#### 1.1）`@XmlRootElement`

这将类或枚举类型映射到 XML 根元素。 当使用`@XmlRootElement`注解对顶级类或枚举类型进行注解时，则其值将表示为 XML 文档中的 XML 元素。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Employee implements Serializable 
{
	//More code
}

```

以上将导致：

```java
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
	//....
</employee>

```

#### 1.2）`@XmlAccessorType`

它定义 JAXB 引擎用来包含到生成的 XML 中的 Java 类的字段或属性。 它有四个可能的值。

*   `FIELD` – 绑定到 JAXB 的类中的每个非静态，非瞬态字段都将自动绑定到 XML，除非由`XmlTransient`注释。
*   `NONE` – 没有任何字段或属性绑定到 XML，除非使用某些 JAXB 注释专门对其进行注释。
*   `PROPERTY` – 绑定到 JAXB 的类中的每个获取器/设置器对将自动绑定到 XML，除非由`XmlTransient`注释。
*   `PUBLIC_MEMBER` – 每个公共获取/设置对和每个公共字段都将自动绑定到 XML，除非由`XmlTransient`注释。
*   默认值为`PUBLIC_MEMBER`。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	private Integer id;
	private String firstName;
	private String lastName;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
	<firstName>Lokesh</firstName>
    <id>1</id>
    <lastName>Gupta</lastName>
</employee>

```

#### 1.3）`@XmlAccessorOrder`

控制类中字段和属性的顺序。 您可以具有预定义的值`ALPHABETICAL`或`UNDEFINED`。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	private Integer id;
	private String firstName;
	private String lastName;
	private Department department;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8"?>
<employee>
   <department>
      <id>101</id>
      <name>IT</name>
   </department>
   <firstName>Lokesh</firstName>
   <id>1</id>
   <lastName>Gupta</lastName>
</employee>

```

#### 1.4）`@XmlType`

它将 Java 类或枚举类型映射到架构类型。 它定义了其子代的类型名称，名称空间和顺序。 它用于将架构中的元素与模型中的元素进行匹配。

```java
@XmlRootElement(name = "employee")
@XmlType(propOrder={"id", "firstName" , "lastName", "department" })
public class Employee implements Serializable 
{
	private Integer id;
	private String firstName;
	private String lastName;
	private Department department;
}

```

#### 1.5）`@XmlElement`

将 JavaBean 属性映射到从属性名称派生的 XML 元素。

```java
@XmlRootElement(name = "employee")
public class Employee implements Serializable 
{
	@XmlElement(name=employeeId)
	private Integer id;

	@XmlElement
	private String firstName;

	private String lastName;
	private Department department;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8"?>
<employee>
	<employeeId>1</employeeId>
   	<firstName>Lokesh</firstName>
</employee>

```

#### 1.6）`@XmlAttribute`

将 JavaBean 属性映射到 XML 属性。

```java
@XmlRootElement(name = "employee")
public class Employee implements Serializable 
{
	@XmlAttribute
	private Integer id;

	private String firstName;
	private String lastName;
	private Department department;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8"?>
<employee id="1">
   <department>
      <id>101</id>
      <name>IT</name>
   </department>
   <firstName>Lokesh</firstName>
   <lastName>Gupta</lastName>
</employee>

```

#### 1.7）`@XmlTransient`

防止将 JavaBean 属性/类型映射到 XML 表示形式。 当放置在一个类上时，它指示该类不应单独映射到 XML。 此类的属性将与其派生类一起映射到 XML，就好像该类是内联的一样。

`@XmlTransient`与所有其他 JAXB 定义的注释互斥。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	@XmlTransient
	private Integer id;

	private String firstName;
	private String lastName;
	private Department department;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8"?>
<employee>
   <firstName>Lokesh</firstName>
   <lastName>Gupta</lastName>
   <department>
      <id>101</id>
      <name>IT</name>
   </department>
</employee>

```

#### 1.8）`@XmlValue`

允许将类映射到具有`simpleContent`或 XML Schema 简单类型的 XML Schema 复杂类型。 它与架构映射到模型映射的关系更大。

#### 1.9）`@XmlList`

用于将属性映射到列表简单类型。 它允许将多个值表示为单个元素中的**由空格分隔的标记**。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	private List<String> hobbies;
}

//

<?xml version="1.0" encoding="UTF-8"?>
<employee>
	<hobbies>Swimming</hobbies>
    <hobbies>Playing</hobbies>
    <hobbies>Karate</hobbies>
</employee>

```

使用`@XmlList`之后，观察输出。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	@XmlList 
	private List<String> hobbies;
}

//

<?xml version="1.0" encoding="UTF-8"?>
<employee>
	<hobbies>Swimming Playing Karate</hobbies>
</employee>

```

]

#### 1.10）`@XmlElementWrapper`

围绕 XML 表示生成包器元素。 它主要用于在集合周围产生包 XML 元素。 因此，它必须与`collection`属性一起使用。

```java
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable 
{
	@XmlElementWrapper(name="hobbies")
	@XmlElement(name="hobby")
	private List<String> hobbies;
}

```

以上将产生：

```java
<?xml version="1.0" encoding="UTF-8"?>
<employee>
	<hobbies>
        <hobby>Swimming</hobby>
        <hobby>Playing</hobby>
        <hobby>Karate</hobby>
    </hobbies>
</employee>

```

## 2）JAXB 注解示例

学习在模型类上应用 JAXB 注解，然后将对象编组到 XML 文件中。

```java
package com.howtodoinjava.demo.model;

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable {

	private static final long serialVersionUID = 1L;

	private Integer id;
	private String firstName;
	private String lastName;

	private Department department;

	@XmlElementWrapper(name="hobbies")
	@XmlElement(name="hobby")
	private List<String> hobbies;

	public Employee() {
		super();
	}

	public Employee(int id, String fName, String lName, Department department) {
		super();
		this.id = id;
		this.firstName = fName;
		this.lastName = lName;
		this.department = department;
	}

	//Setters and Getters
}

```

```java
package com.howtodoinjava.demo;

import java.io.File;
import java.util.Arrays;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import com.howtodoinjava.demo.model.Department;
import com.howtodoinjava.demo.model.Employee;

public class JaxbExample 
{
	public static void main(String[] args) 
	{
		Employee employee = new Employee(1, "Lokesh", "Gupta", new Department(101, "IT"));

		employee.setHobbies(Arrays.asList("Swimming","Playing", "Karate"));

		jaxbObjectToXML(employee);
	}

	private static void jaxbObjectToXML(Employee employee) 
	{
	    try {
	        JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class);
	        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

	        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML

	        //Print XML String to Console
	        jaxbMarshaller.marshal(employee, new File("employee.xml"));

	    } catch (JAXBException e) {
	        e.printStackTrace();
	    }
	}
}

```

```java
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <id>1</id>
    <firstName>Lokesh</firstName>
    <lastName>Gupta</lastName>
    <department>
        <id>101</id>
        <name>IT</name>
    </department>
    <hobbies>
        <hobby>Swimming</hobby>
        <hobby>Playing</hobby>
        <hobby>Karate</hobby>
    </hobbies>
</employee>

```

将我的问题放在评论部分。

学习愉快！

参考： [JAXB 注解 Java 文档](https://docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.html)