«1. Обзор

JiBX — это инструмент для привязки данных XML к объектам Java. Он обеспечивает высокую производительность по сравнению с другими распространенными инструментами, такими как JAXB.

JiBX также является довольно гибким по сравнению с другими инструментами Java-XML, используя определения связывания, чтобы отделить структуру Java от представления XML, чтобы каждое из них можно было изменять независимо.

В этой статье мы рассмотрим различные способы, предоставляемые JiBX для привязки XML к объектам Java.

2. Компоненты JiBX

2.1. Документ определения привязки

Документ определения привязки указывает, как ваши объекты Java преобразуются в XML или из него.

Компилятор связывания JiBX принимает одно или несколько определений связывания в качестве входных данных вместе с фактическими файлами классов. Он компилирует определение привязки в байт-код Java, добавляя его в файлы классов. Как только файлы классов были расширены с помощью этого скомпилированного кода определения привязки, они готовы к работе со средой выполнения JiBX.

2.2. Инструменты

Есть три основных инструмента, которые мы собираемся использовать:

    BindGen — для создания определений привязки и сопоставления схемы из кода Java CodeGen — для создания кода Java и определения привязки из XML схема JiBX2Wsdl — создание определения привязки и соответствующего WSDL вместе с определением схемы из существующего кода Java

3. Конфигурация Maven

3.1. Зависимости

Нам нужно добавить зависимость jibx-run в pom.xml:

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

Последнюю версию этой зависимости можно найти здесь.

3.2. Плагины

Чтобы выполнять различные шаги в JiBX, такие как генерация кода или генерация привязки, нам нужно настроить maven-jibx-plugin в pom.xml.

В случае, когда нам нужно начать с 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>

Когда у нас есть схема и мы сгенерируем Java-код и определение привязки, maven-jibx-plugin настроен с информацией о пути к файлу схемы и пути к каталогу исходного кода:

<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. Определения привязки

Определения привязки являются основной частью JiBX. Базовый файл привязки определяет соответствие между полями объекта XML и Java:

<binding>
    <mapping name="customer" class="com.baeldung.xml.jibx.Customer">
        ...
        <value name="city" field="city" />
    </mapping>
</binding>

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>

Соответствующими классами для этой структуры будут:

public class Customer {
    
    private Person person;
    ...
    
    // standard getters and setters

}

public class Person {
    
    private String lastName;
    ...
    
    // standard getters and setters

}

4.2. Сопоставление коллекций и массивов

Связывание JiBX обеспечивает простой способ работы с коллекциями объектов:

<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>
     ...
</mapping>

Давайте посмотрим на соответствующие сопоставления объектов Java:

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

public static class Address {
    private String name;
    
    ...
    // standard getters and setter
    
}

4.3. Расширенные сопоставления

До сих пор мы видели базовое определение сопоставления. Отображение JiBX предоставляет различные варианты отображения, такие как абстрактное отображение и наследование отображения.

Давайте посмотрим, как мы можем определить абстрактное отображение:

<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;
    
    // standard getters and setters
    
}

Здесь мы указали несколько полей Phone в классе Customer. Сам телефон снова является POJO:

public class Phone {

    private String number;
    
    // standard getters and setters
}

В дополнение к обычным сопоставлениям мы также можем определить расширения. Каждое отображение расширения ссылается на некоторое базовое отображение. Во время маршалинга фактический тип объекта определяет, какое сопоставление XML применяется.

Давайте посмотрим, как работают расширения:

<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;
    
    // standard getters and setters
}

5. Заключение

В этой быстрой статье мы рассмотрели различные способы, с помощью которых мы можем используйте JiBX для преобразования XML в/из объектов Java. Мы также увидели, как можно использовать определения привязки для работы с различными представлениями.

Полный код этой статьи доступен на GitHub.