JAXB 注解
详细了解 JAXB 注解及其在编组和解组操作期间的用法。
1)JAXB 注解列表
注解 | 范围 | 描述 |
---|---|---|
@XmlRootElement |
类,枚举 | 定义 XML 根元素。 根 Java 类在创建时需要在 JAXB 上下文中注册。 |
@XmlAccessorType |
包,类 | 定义 JAXB 引擎用于绑定的 Java 类的字段和属性。 它具有四个值:PUBLIC_MEMBER ,FIELD ,PROPERTY 和NONE 。 |
@XmlAccessorOrder |
包,类 | 定义子项的顺序。 |
@XmlType |
类,枚举 | 将 Java 类映射到架构类型。 它定义了其子类型的名称和顺序。 |
@XmlElement |
字段 | 将字段或属性映射到 XML 元素 |
@XmlAttribute |
字段 | 将字段或属性映射到 XML 属性 |
@XmlTransient |
字段 | 防止将字段或属性映射到 XML 模式 |
@XmlValue |
字段 | 将字段或属性映射到 XML 标记上的文本值。 |
@XmlList |
字段,参数 | 将集合映射到以空格分隔的值列表。 |
@XmlElementWrapper |
字段 | 将 Java 集合映射到 XML 包的集合 |
阅读更多:将 Java 对象转换为 XML
1.1)@XmlRootElement
这将类或枚举类型映射到 XML 根元素。 当使用@XmlRootElement
注解对顶级类或枚举类型进行注解时,则其值将表示为 XML 文档中的 XML 元素。
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Employee implements Serializable
{
//More code
}
以上将导致:
<?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
。
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable
{
private Integer id;
private String firstName;
private String lastName;
}
以上将产生:
<?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
。
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable
{
private Integer id;
private String firstName;
private String lastName;
private Department department;
}
以上将产生:
<?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 类或枚举类型映射到架构类型。 它定义了其子代的类型名称,命名空间和顺序。 它用于将架构中的元素与模型中的元素进行匹配。
@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 元素。
@XmlRootElement(name = "employee")
public class Employee implements Serializable
{
@XmlElement(name=employeeId)
private Integer id;
@XmlElement
private String firstName;
private String lastName;
private Department department;
}
以上将产生:
<?xml version="1.0" encoding="UTF-8"?>
<employee>
<employeeId>1</employeeId>
<firstName>Lokesh</firstName>
</employee>
1.6)@XmlAttribute
将 JavaBean 属性映射到 XML 属性。
@XmlRootElement(name = "employee")
public class Employee implements Serializable
{
@XmlAttribute
private Integer id;
private String firstName;
private String lastName;
private Department department;
}
以上将产生:
<?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 定义的注解互斥。
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable
{
@XmlTransient
private Integer id;
private String firstName;
private String lastName;
private Department department;
}
以上将产生:
<?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
用于将属性映射到列表简单类型。 它允许将多个值表示为单个元素中的由空格分隔的标记。
@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
之后,观察输出。
@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
属性一起使用。
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee implements Serializable
{
@XmlElementWrapper(name="hobbies")
@XmlElement(name="hobby")
private List<String> hobbies;
}
以上将产生:
<?xml version="1.0" encoding="UTF-8"?>
<employee>
<hobbies>
<hobby>Swimming</hobby>
<hobby>Playing</hobby>
<hobby>Karate</hobby>
</hobbies>
</employee>
2)JAXB 注解示例
学习在模型类上应用 JAXB 注解,然后将对象编组到 XML 文件中。
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
}
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();
}
}
}
<?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 文档