JAXB (Java Architecture for XML Binding) 是 Java 標準庫(Java 6-10)內置的對象-XML 映射框架,無需第三方依賴(Java 11+ 需額外引入 jaxb-api 與實現)。通過註解聲明式映射,實現 Java 對象與 XML 的雙向轉換,適合配置文件、報文交換、數據持久化等場景。
| 註解 | 作用目標 | 核心屬性 | 說明 |
|---|---|---|---|
@XmlRootElement | Class | name, namespace | 標識 XML 根元素,類名默認 |
@XmlElement | Field/Getter | name, required, nillable | 映射為 XML 子元素,字段名默認 |
@XmlAttribute | Field/Getter | name, required | 映射為 XML 屬性 |
@XmlAccessorType | Class | value (FIELD/PROPERTY/PUBLIC_MEMBER/NONE) | 控制默認映射策略,推薦 FIELD |
@XmlTransient | Field/Getter | - | 忽略該字段,不參與序列化 |
@XmlType | Class | propOrder, name, namespace | 定義元素順序、類型名 |
@XmlElementWrapper | Field/Getter | name | 為集合添加包裹元素 |
@XmlJavaTypeAdapter | Field/Class/Package | value | 自定義類型轉換器 |
@XmlRootElement(name = "company")
@XmlAccessorType(XmlAccessType.FIELD) // 直接綁定字段,無需 Getter
public class Company {
@XmlElementWrapper(name = "employees")
@XmlElement(name = "employee")
private List<Employee> employees = new ArrayList<>();
public void addEmployee(Employee e) { employees.add(e); }
// Getter/Setter 可省略(FIELD 模式)
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"id", "name"}) // 指定輸出順序
public class Employee {
@XmlElement(name = "id")
private String id;
@XmlElement(name = "name")
private String name;
// Getter/Setter
}
// 1. 創建上下文(線程安全,建議單例緩存)
JAXBContext ctx = JAXBContext.newInstance(Company.class); // 或包名 "com.example.model"
// 2. 序列化:對象 → XML
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 縮進美化
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.marshal(company, System.out); // 輸出到 OutputStream/Writer/File/Node
// 3. 反序列化:XML → 對象
Unmarshaller unmarshaller = ctx.createUnmarshaller();
Company company = (Company) unmarshaller.unmarshal(new File("company.xml")); // 支持 InputStream/Reader/URL/Node
@XmlRootElement(name = "order", namespace = "https://example.com/ns")
@XmlSchema(namespace = "https://example.com/ns", elementFormDefault = XmlNsForm.QUALIFIED)
package com.example.model;
// package-info.java 中聲明 @XmlSchema
public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
private static final DateTimeFormatter FMT = DateTimeFormatter.ISO_LOCAL_DATE;
public LocalDate unmarshal(String v) { return LocalDate.parse(v, FMT); }
public String marshal(LocalDate v) { return v.format(FMT); }
}
// 使用
@XmlJavaTypeAdapter(LocalDateAdapter.class)
private LocalDate createDate;
使用 @XmlID / @XmlIDREF 或 @XmlTransient 打破循環,或配合 CycleRecoverable 自定義恢復邏輯。
// 類 → XSD
marshaller.setSchema(schema); // 驗證輸出
ctx.generateSchema(new SchemaOutputResolver() { ... });
// XSD → 類 (xjc 命令或 maven-jaxb2-plugin)
xjc -d src/main/java -p com.example.model schema.xsd
JAXBContext.newInstance 開銷大,必須緩存單例;@XmlAccessorType(FIELD),避免重複註解與邏輯不一致;new ArrayList<>(),防止反序列化為 null;JAXBException,區分驗證錯誤與映射錯誤;JAXB 以註解驅動、零配置、標準庫內置三大優勢,成為 Java XML 綁定首選。掌握核心註解、上下文管理、Marshaller/Unmarshaller 配置,即可輕鬆實現對象與 XML 的高效雙向轉換。對於高性能、流式、複雜 Schema 場景,可搭配 StAX 或遷移至 Jackson XML 模塊。