1. 概述

JiBX 是一个将 XML 数据与 Java 对象绑定的工具库。相比 JAXB 等常见框架,它在性能上表现更出色。

核心优势

  • 解耦 Java 结构与 XML 表示,两者可独立修改
  • 通过绑定定义实现灵活映射
  • 性能优于同类工具

适用场景

  • 需要高性能 XML 处理
  • 要求 Java 对象与 XML 结构解耦
  • 避免注解污染业务代码

2. JiBX 核心组件

2.1 绑定定义文档

绑定定义文档(Binding Definition Document)指定 Java 对象与 XML 的转换规则。

⚠️ 关键流程

  1. 绑定编译器读取绑定定义 + class 文件
  2. 将绑定规则编译为字节码注入 class 文件
  3. 增强后的 class 文件可直接与 JiBX 运行时交互

2.2 核心工具集

工具名称 功能描述
BindGen 从 Java 代码生成绑定定义和匹配的 Schema
CodeGen 从 XML Schema 生成 Java 代码和绑定定义
JiBX2Wsdl 从 Java 代码生成绑定定义、WSDL 和 Schema

3. Maven 配置

3.1 依赖配置

pom.xml 添加核心依赖:

<dependency>
    <groupId>org.jibx</groupId>
    <artifactId>jibx-run</artifactId>
    <version>1.3.1</version>
</dependency>

最新版本可查阅 Maven 中央仓库

3.2 插件配置

场景1:从 Java 代码生成绑定定义

<plugin>
    <groupId>org.jibx</groupId>
    <artifactId>maven-jibx-plugin</artifactId>
    <configuration>
        <directory>src/main/resources</directory>
        <includes>
            <includes>*-binding.xml</includes>
        </includes>
        <excludes>
            <exclude>template-binding.xml</exclude>
        </excludes>
        <verbose>true</verbose>
    </configuration>
    <executions>
        <execution>
            <phase>process-classes</phase>
            <goals>
                <goal>bind</goal>
            </goals>
        </execution>
    </executions>
</plugin>

场景2:从 Schema 生成 Java 代码

<plugin>
    <groupId>org.jibx</groupId>
    <artifactId>maven-jibx-plugin</artifactId>
    <executions>
        <execution>
            <id>generate-java-code-from-schema</id>
            <goals>
                <goal>schema-codegen</goal>
            </goals>
            <configuration>
                <directory>src/main/jibx</directory>
                <includes>
                    <include>customer-schema.xsd</include>
                </includes>
                <verbose>true</verbose>
            </configuration>
        </execution>
        <execution>
            <id>compile-binding</id>
            <goals>
                <goal>bind</goal>
            </goals>
            <configuration>
                <directory>target/generated-sources</directory>
                <load>true</load>
                <validate>true</validate>
                <verify>true</verify>
            </configuration>
        </execution>
    </executions>
</plugin>

4. 绑定定义详解

4.1 结构映射

使 XML 结构与对象结构保持一致:

<binding>
    <mapping name="customer" class="com.baeldung.xml.jibx.Customer">
        <structure name="person" field="person">
            <value name="last-name" field="lastName" />
        </structure>
    </mapping>
</binding>

对应 Java 类:

public class Customer {
    private Person person;
    // getters/setters
}

public class Person {
    private String lastName;
    // getters/setters
}

4.2 集合与数组映射

简化集合对象处理:

<mapping class="com.baeldung.xml.jibx.Order" name="Order">
    <collection get-method="getAddressList" 
                set-method="setAddressList" 
                usage="optional" 
                createtype="java.util.ArrayList">
        <structure type="com.baeldung.xml.jibx.Order$Address" 
                   name="Address">
            <value style="element" name="Name" 
                   get-method="getName" 
                   set-method="setName"/>
        </structure>
    </collection>
</mapping>

对应 Java 类:

public class Order {
    List<Address> addressList = new ArrayList<>();
    // getters/setters
}

public static class Address {
    private String name;
    // getters/setters
}

4.3 高级映射技巧

抽象映射

<binding>
    <mapping name="customer" class="com.baeldung.xml.jibx.Customer">
        <structure name="person" field="person">
            <value name="name" field="name" />
        </structure>
        <structure name="home-phone" field="homePhone" />
        <structure name="office-phone" field="officePhone" />
        <value name="city" field="city" />
    </mapping>
    <mapping name="phone" class="com.baeldung.xml.jibx.Phone" abstract="true">
        <value name="number" field="number"/>
    </mapping>
</binding>

对应 Java 类:

public class Customer {
    private Person person;
    private Phone homePhone;
    private Phone officePhone;
    // getters/setters
}

public class Phone {
    private String number;
    // getters/setters
}

映射继承

<binding>
    <mapping class="com.baeldung.xml.jibx.Identity" abstract="true">
        <value name="customer-id" field="customerId"/>
    </mapping>
    <mapping name="person" 
             class="com.baeldung.xml.jibx.Person" 
             extends="com.baeldung.xml.jibx.Identity">
        <structure map-as="com.baeldung.xml.jibx.Identity"/>
    </mapping>
</binding>

对应 Java 类:

public class Identity {
    private long customerId;
    // getters/setters
}

5. 总结

JiBX 通过绑定定义实现了 XML 与 Java 对象的高效转换,核心优势在于:
性能卓越:字节码增强技术带来极致性能
解耦设计:XML 结构与 Java 对象可独立演进
灵活映射:支持结构映射、集合处理、继承等高级特性

踩坑提示:绑定定义文件路径需严格匹配 Maven 插件配置,否则会报 Binding not found 错误。建议将绑定文件统一放在 src/main/resources 目录下管理。


原始标题:Introduction to JiBX | Baeldung