JAXB 注解(Annotations)

JAXB 注解列表

Annotation范围描述
@XmlRootElement类,枚举定义 XML 根元素。根 Java 类在创建时需要在 JAXB 上下文中注册。
@XmlAccessorType包、类定义 JAXB 引擎用于绑定的 Java 类的字段和属性。它有四个值:PUBLIC_MEMBERFIELDPROPERTYNONE
@XmlAccessorOrder包、类定义子项的顺序。
@XmlType类,枚举将 Java 类映射到模式类型。它定义了其子项的类型名称和顺序。
@XmlElement场地将字段或者属性映射到 XML 元素
@XmlAttribute场地将字段或者属性映射到 XML 属性
@XmlTransient场地防止将字段或者属性映射到 XML 架构
@XmlValue场地将字段或者属性映射到 XML 标记上的文本值。
@XmlList字段、参数将集合映射到由空格分隔的值列表。
@XmlElementWrapper场地将 Java 集合映射到 XML 包装的集合

@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>

@XmlAccessorType

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

  • FIELD- JAXB 绑定类中的每个非静态、非瞬态字段都将自动绑定到 XML,除非由 XmlTransient注释。
  • NONE- 没有任何字段或者属性绑定到 XML,除非它们被一些 JAXB 注释专门注释。
  • PROPERTY- JAXB 绑定类中的每个 getter/setter 对都将自动绑定到 XML,除非由 XmlTransient注释。
  • PUBLIC_MEMBER- 每个公共 getter/setter 对和每个公共字段都将自动绑定到 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>JackLi</firstName>
    <id>1</id>
    <lastName>Gupta</lastName>
</employee>

@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>JackLi</firstName>
   <id>1</id>
   <lastName>Gupta</lastName>
</employee>

@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;
}

@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>JackLi</firstName>
</employee>

@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>JackLi</firstName>
   <lastName>Gupta</lastName>
</employee>

@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>JackLi</firstName>
   <lastName>Gupta</lastName>
   <department>
      <id>101</id>
      <name>IT</name>
   </department>
</employee>

@XmlValue

允许将类映射到具有 simpleContent 或者 XML Schema 简单类型的 XML Schema 复杂类型。
它与模式映射到模型映射更相关。

@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>

]

@XmlElementWrapper

围绕 XML 表示生成包装器元素。
这主要用于围绕集合生成包装器 XML 元素。
因此,它必须与集合属性一起使用。

@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>
on  it road.com

JAXB注解示例

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

package com.onitroad.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.onitroad.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.onitroad.demo.model.Department;
import com.onitroad.demo.model.Employee;
public class JaxbExample 
{
	public static void main(String[] args) 
	{
		Employee employee = new Employee(1, "JackLi", "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>JackLi</firstName>
    <lastName>Gupta</lastName>
    <department>
        <id>101</id>
        <name>IT</name>
    </department>
    <hobbies>
        <hobby>Swimming</hobby>
        <hobby>Playing</hobby>
        <hobby>Karate</hobby>
    </hobbies>
</employee>
日期:2020-09-17 00:09:40 来源:oir作者:oir