Перейти к основному содержимому

Введение в JiBX

· 4 мин. чтения

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 .