読者です 読者をやめる 読者になる 読者になる

CXFで生成したスタブにequals()やhashCode()が実装されるようにする

CXFを使ってSOAPのサービスを構築する際、多くの場合、wsdl2Javaを利用してWSDLからスタブを生成(XMLからJavaへのデシリアライズ)することになると思います。 このとき、単にwsdl2javaを実行するだけでは、生成されたクラスにはequals()やhashCode()などのユーティリティが実装されていません。

そこで、CXFのwsdl2javaで、equals()やhashCode()が実装されたスタブを生成する方法を調べてみました。

基本方針

Javaコードへのデシリアライズにおいて、JAXB2 Basics Pluginをプラグインする事によって、equals()やhashCode()などのユーティリティが生成されるようにします。 mavenやantからwsdl2javaを実行する際に、JAXB2 Basics Pluginをプラグインする手順を以下に記します。

mavenでやる場合

mavenでやる方法は、Using JAXB2 Basics Plugins with CXF に詳しいです。「A fragment of pom.xml/build/plugins」にあるように、pom.xmlに追記すればよい模様。

ant でやる場合

ant でやる場合、antからJavaコマンドでWSDLToJavaをたたいてやるわけですが、このときクラスパスにJAXB2 Basics Pluginプラグインを加えておくと、ユーティリティを追加するためのオプションが使えるようになります。 targetタグの記述例を記します。"-xjc-XhashCode"、"-xjc-Xequals"が該当のオプションです。

<!-- equals()とhashCode()を追加する場合 -->
<target name="wsdl2java.stub"
    <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
        <arg value="-xjc-XhashCode" />
        <arg value="-xjc-Xequals" />
        <arg value="-verbose" />
        <arg value="-validate" />
        <arg value="-mark-generated" />
        <arg value="-d" />
        <arg value="${path_dist}" />
        <arg value="-p" />
        <arg value="http://www.example.jp/2014/12/example/ws=jp.example.ws" />
        <arg value="-p" />
        <arg value="http://www.example.jp/2014/12/example/ws/types=jp.example.ws.types" />
        <arg value="${path_wsdl}" />
        <classpath>
            <path refid="${classpath}" />
        </classpath>
    </java>
</target>

クラスパスに入れる必要のある、プラグインのjarは、MavenRepositoryから探してきます。当たり前かもしれませんが、素のantでは依存モジュールの解決を自動ではやってくれません。

それにしても、CXFは本当に日本語の技術情報が少ないですね…。