JiBXの紹介
1. 概要
JiBX は、XMLデータをJavaオブジェクトにバインドするためのツールです。 JAXBなどの他の一般的なツールと比較して安定したパフォーマンスを提供します。
JiBXは、他のJava-XMLツールと比較した場合にも非常に柔軟性があり、バインディング定義を使用してJava構造をXML表現から切り離し、それぞれを個別に変更できるようにします。
この記事では、XMLをJavaオブジェクトにバインドするJiBXによって提供されるさまざまな方法について説明します。
2. JiBXのコンポーネント
2.1. バインディング定義ドキュメント
バインディング定義ドキュメントは、JavaオブジェクトをXMLに変換する方法またはXMLから変換する方法を指定します。
JiBXバインディングコンパイラは、実際のクラスファイルとともに、1つ以上のバインディング定義を入力として受け取ります。 バインディング定義をクラスファイルに追加することにより、Javaバイトコードにコンパイルします。 このコンパイルされたバインディング定義コードでクラスファイルが拡張されると、JiBXランタイムで動作する準備が整います。
2.2. ツール
使用する主なツールは3つあります。
- BindGen –Javaコードからバインディングおよびマッチングスキーマ定義を生成します
- CodeGen –XMLスキーマからJavaコードとバインディング定義を作成します
- JiBX2Wsdl –既存のJavaコードからのスキーマ定義とともにバインディング定義と一致するWSDLを作成します
3. Maven構成
3.1. 依存関係
pom.xmlにjibx-run依存関係を追加する必要があります。
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<version>1.3.1</version>
</dependency>
この依存関係の最新バージョンは、ここにあります。
3.2. プラグイン
コード生成やバインディング生成など、JiBXでさまざまな手順を実行するには、pom.xmlでmaven-jibx-pluginを構成する必要があります。
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
}
ここでは、Customerクラスに複数のPhoneフィールドを指定しました。 電話自体も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でから入手できます。