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.foreach.xml.jibx.Customer">
...
<value name="city" field="city" />
</mapping>
</binding>
4.1. Отображение структуры
Отображение структуры делает структуру XML похожей на структуру объекта:
<binding>
<mapping name="customer" class="com.foreach.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.foreach.xml.jibx.Order" name="Order">
<collection get-method="getAddressList"
set-method="setAddressList" usage="optional"
createtype="java.util.ArrayList">
<structure type="com.foreach.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.foreach.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.foreach.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.foreach.xml.jibx.Identity"
abstract="true">
<value name="customer-id" field="customerId"/>
</mapping>
...
<mapping name="person"
class="com.foreach.xml.jibx.Person"
extends="com.foreach.xml.jibx.Identity">
<structure map-as="com.foreach.xml.jibx.Identity"/>
...
</mapping>
...
</binding>
Давайте посмотрим на соответствующие объекты Java:
public class Identity {
private long customerId;
// standard getters and setters
}
5. Вывод
В этой быстрой статье мы рассмотрели различные способы использования JiBX для преобразования XML в/из объектов Java. Мы также увидели, как можно использовать определения привязки для работы с различными представлениями.
Полный код для этой статьи доступен на GitHub .