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は本当に日本語の技術情報が少ないですね…。