私が取り組んでいるコードは、jaxb2-maven-plugin
fromを使用しorg.codehaus.mojo
てXSDスキーマからJavaクラスを生成しています。equals()
それらのクラスのメソッドとメソッドを自動的に実装する方法を探していますがhashCode()
、方法がないようです。それを行う他のJAXB2Mavenプラグイン(たとえばhttp://confluence.highsource.org/display/J2B/Home)があることは知っていますが、以前にこの問題に遭遇した人がいるかどうか、またそれを修正します。xjc
ゴールを使用してクラスを生成しています。
7 に答える
あなたが言及しているJAXB2Basicsはのプロパティではなく、maven-jaxb2-plugin
XJCなどで使用できるJAXB2.xプラグインのスタンドアロンセットですjaxb2-maven-plugin
。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<arguments>
<argument>-Xequals</argument>
<argument>-XhashCode</argument>
</arguments>
</configuration>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.12.0</version>
</dependency>
</dependencies>
</plugin>
私が聞きたかったこと-なぜ単に使用しないのmaven-jaxb2-plugin
ですか?Codehausプラグインと比較して、JAXB2プラグインの構成サポートなど、はるかに多くの機能を備えています。
JAXBで生成されたクラスをコードのビジネスオブジェクトとして使用することに強く反対します。JAXBによって生成されるクラスは、基本的に要素情報をxmlファイルからBeanのフィールドに移動することを目的としたBeanです。XML-> Javaおよびその逆の変換は常に白黒ではないため、私は常に、SOAPサービスにこれらの生成されたBeanクラスを実際のビジネスオブジェクトに変換させています。これは私の個人的な意見であり、他の人がこの状況で何をするかを検討することを望んでいることに注意してください。
ただし、質問に答えるには、別のプラグインを使用するか、IDEを使用してequalsメソッドとhashCodeメソッドを作成します。
お役に立てば幸いです。
編集:
私はこれについて私の理由を述べるのを忘れました、お詫びします。プロジェクトの次のバージョンで、JAXBで生成されたクラスにさらに動作を追加したいが、スキーマにいくつかの変更を加えたいとしましょう。これで、JAXBで生成されたクラスを再生成し、古い動作を元に戻し、アプリケーションをバグの影響を受けやすくしていると思います。JAXBで生成されたクラスは、ビジネスロジックではなく、XMLスキーマタイプ(したがってSOAPメッセージ)を反映することになっています。それが理にかなっていることを願っています。
これが最も簡単な方法です。要件に応じてバージョンを更新してください。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-commons-lang</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>JAXB generate content classes</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/schema</schemaDirectory>
<outputDirectory>${project.build.directory}/generated-sources/jaxb</outputDirectory>
<schemaFiles>**/*.xsd</schemaFiles>
<packageName>com.lexus.web.content.model</packageName>
<arguments>-Xcommons-lang</arguments>
</configuration>
</execution>
</executions>
</plugin>
xmldsig-core-schemaを参照している場合は、流暢なビルダーインターフェイス(生成されたJAXBクラスの処理を容易にする)とカタログファイルへの参照の使用を検討することもできます(リモートスキーマがないため、生成プロセスが高速化されます)。 W3Cからのクエリが実行されます-それらのサーバーは通常、応答を遅らせます)。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>net.java.dev.jaxb2-commons</groupId>
<artifactId>jaxb-fluent-api</artifactId>
<version>2.0.1</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml</groupId>
<artifactId>jaxb-xjc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.4</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml</groupId>
<artifactId>jaxb-xjc</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory>
<packageName>[your package name goes here]</packageName>
<outputDirectory>${build.directory}/generated/src/main/java</outputDirectory>
<bindingDirectory>${basedir}/src/main/resources/xsd</bindingDirectory>
<extension>true</extension>
<catalog>${basedir}/src/main/resources/xsd-catalog/catalog.cat</catalog>
<extension>true</extension>
<arguments>-Xfluent-api -Xequals -XhashCode -XtoString</arguments>
</configuration>
</plugin>
カタログファイルは次のようになります。
--
sample catalog file.
double hyphens are used to begin and end a comment section.
--
SYSTEM "http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" "xmldsig-core-schema.xsd"
そして、ここにxmldisg-core-schema.xsdへのリンクがあります:http ://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd
リンクが壊れていないことに注意してください-W3Cサーバーは応答を数秒遅らせているだけです。JAXB生成を含む自動ビルドプロセス中にそれが発生した場合、非常に面倒になりますか?
私の答えは、生成されたコードへの3番目の部分の依存関係を買う余裕がない人のためのものです。
org.jvnet.jaxb2_commons:jaxb2-basicsプラグインは、生成されたコードに多くのインクルードを追加し、org.jvnet
プロジェクトはに依存しorg.jvnet.jaxb2_commons:jaxb2-basics-runtime
ます。
org.andromda.thirdparty.jaxb2_commons :commons-lang-pluginプラグインは、に依存するコードを生成しますcommons-lang:commons-lang
。この依存関係は、状況によっては耐えやすい場合があります。
私はついにこのソースコードを見つけました、それはある時点でcom.sun.xml.bind:jaxb-xjcに含まれているかもしれません(バージョン2.2.4?)、しかしそれまで私はあなた自身のプラグインを書く以外の解決策を見ることができません。
PS: confluence.highsource.orgにアクセスできません。404が表示されます。役に立ったと思います。
PPS:私の状況では、私が構築しているアプリケーションは、許可されたJavaライブラリのセットが非常に限られている環境を対象としています(不調和なセキュリティ制限)。退屈なメソッドを追加するためだけに、生成されたソースにjaxb2_commons
多数の依存関係が含まれているという事実に少しがっかりしました。私はjvnetの戦略を理解することができます、彼らのツールは非常に強力です、私はただ大ハンマーを使ってナッツを割ろうとしているのかもしれません。それでも、自分の状況に適したツールを見つけるのは非常に困難でした。org.jvnet
equals
サードパーティのコードへの依存関係を必ずしも生成しないJAXB用のfluent-builderプラグインもあります。さらに、これは真の「ビルダー」デザインパターンですが、「fluent-api」プラグインは、生成されたクラスにビルダーのようなメソッドを追加するだけです。https://github.com/mklemm/jaxb2-rich-contract-pluginまた 、生成されたクラスを不変にするオプションがあり、既存のオブジェクトの状態を新しいビルダーインスタンスにコピーするメソッドを生成できます。 「部分的な」オブジェクトのコピー。
私にとって最も簡単な方法は、maven-jaxb2-plugin
(受け入れられた回答に記載されているように)を使用することです。
- pom.xmlに追加します
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.12.0</version>
</dependency>
- プラグインを追加します
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<generateDirectory>target/generated-sources</generateDirectory>
<generatePackage>my.package</generatePackage>
</configuration>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-XtoString</arg>
<arg>-Xequals</arg>
<arg>-XhashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.12.0</version>
</plugin>
</plugins>
</configuration>
</plugin>
見る
- JAXB2基本プラグインmaven-jaxb2-プラグインのドキュメント/例
- JavaでJAXBクラスを生成しながらtoString、hashCode、equalsを追加-別の同様のstackoverflowスレッド