1概要


JiBX

はXMLデータをJavaオブジェクトにバインドするためのツールです。 JAXBなどの他の一般的なツールと比較して堅実なパフォーマンスを提供します。

JiBXは他のJava-XMLツールと比較しても非常に柔軟で、バインディング定義を使用してJava構造をXML表現から切り離し、それぞれを独立して変更できるようにします。

この記事では、XMLをJavaオブジェクトにバインドするためにJiBXによって提供されるさまざまな方法を探ります。


2 JiBX

のコンポーネント


2.1. バインディング定義文書

バインディング定義文書は、JavaオブジェクトをXMLとの間で変換する方法を指定します。

JiBXバインディングコンパイラは、実際のクラスファイルとともに、1つ以上のバインディング定義を入力として受け取ります。バインディング定義をクラスファイルに追加して、Javaバイトコードにコンパイルします。クラスファイルがこのコンパイル済みバインディング定義コードで拡張されたら、それらはJiBXランタイムで動作するようになります。


2.2. ツール

使用する主なツールは3つあります。



  • BindGen


    – バインディングおよび一致するスキーマ定義を生成します

Javaコードから



CodeGen

** – からJavaコードとバインディング定義を作成します。

XMLスキーマ



JiBX2Wsdl

** – バインディング定義とそれに対応するWSDLを作成します。

既存のJavaコードからのスキーマ定義とともに


3 Mavenの設定


3.1. 依存関係


pom.xml

にjibx-run依存関係を追加する必要があります。

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

この依存関係の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.jibx%22%20AND%20a%3A%22jibx-run%22[で見つけることができます。ここに]。


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.

Collection



Array

のマッピング

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

フィールドを指定しました。

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結論

このクイック記事では、XMLからJavaオブジェクトへ/からXMLへの変換にJiBXを使用することができるさまざまな方法について説明しました。また、バインディング表現をさまざまな表現で機能させるために使用する方法についても説明しました。

この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/xml[GitHubで利用可能]です。