ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 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)