jaxbで生成されたクラスに対してequalsおよびcompareToメソッドを生成できるかどうか、jaxbを使用してスキーマからクラスを生成します。これらのクラスは、実際にはそれらを一意に識別できるようにするguidを持っていますが、SetなどのCollectionクラスが同じエンティティの重複インスタンスを認識するようにequals/compareメソッドを実装するにはどうすればよいですか?jaxbで生成されたクラスに対してequalsおよびcompareToメソッドを生成することは可能ですか?
答えて
ここで別のアプローチがあります。
あなたはhashCode
とequals
メソッドを追加する-XcodeInjector
プラグインを使用することができます。これが十分でない場合は、 "/に等しいのhashCodeのプロパティを選択できるように"(filing an issue in JAXB2-Basicsを検討し、
<jxb:bindings schemaLocation="schema.xsd">
<jxb:bindings node="/xs:schema/xs:complexType[@name='MyItemType']">
<ci:code>
@Override
public int hashCode() { return guid == null? 0 : guid.hashCode();}
</ci:code>
</jxb:bindings>
</jxb:bindings>
:
Inserting code with XJC+xsd+jxb using the options " -Xinject-code -extension "
のような何か:
この質問を参照してください。 )または独自のプラグインを実装することができます。
解決策のように見えます –
免責事項:私はhashCode
とequals
メソッドを生成することが可能なJAXB2プラグインを提供jaxb2-basics
の著者です。ここで
は、Mavenのための使用例です:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-Xequals</arg>
<arg>-XhashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>...</version>
</plugin>
</plugins>
</configuration>
</plugin>
(Antのためdocumentationを参照してください。)
あなたは(ランタイムレスhashCode
とequals
メソッドを生成したハッシュコードを-XsimpleHashCode
と-XsimpleEquals
を使用するか、計算を等しくすることができます(戦略的な)hashCode
とequals
のメソッドを生成する-XhashCode
/-Xequals
です(ハッシュコード/等価計算は、渡された戦略メソッドに委譲されています) 。ここで
が-XsimpleHashCode
が生成するものです:
public class Customer {
...
public int hashCode() {
int currentHashCode = 1;
{
currentHashCode = (currentHashCode* 31);
String theAddress;
theAddress = this.getAddress();
if (theAddress!= null) {
currentHashCode += theAddress.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
Boolean theBlueEyes;
theBlueEyes = this.isBlueEyes();
if (theBlueEyes!= null) {
currentHashCode += theBlueEyes.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
String theFamilyName;
theFamilyName = this.getFamilyName();
if (theFamilyName!= null) {
currentHashCode += theFamilyName.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
String theGivenName;
theGivenName = this.getGivenName();
if (theGivenName!= null) {
currentHashCode += theGivenName.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
List<String> theMiddleInitials;
theMiddleInitials = (this.isSetMiddleInitials()?this.getMiddleInitials():null);
if (theMiddleInitials!= null) {
currentHashCode += theMiddleInitials.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
String thePostCode;
thePostCode = this.getPostCode();
if (thePostCode!= null) {
currentHashCode += thePostCode.hashCode();
}
}
{
currentHashCode = (currentHashCode* 31);
boolean theSingle;
theSingle = this.isSingle();
currentHashCode += (theSingle? 1231 : 1237);
}
return currentHashCode;
}
}
はここ-XhashCode
が生成するものです:
public class Customer implements HashCode
{
...
public int hashCode(ObjectLocator locator, HashCodeStrategy strategy) {
int currentHashCode = 1;
{
String theAddress;
theAddress = this.getAddress();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "address", theAddress), currentHashCode, theAddress);
}
{
Boolean theBlueEyes;
theBlueEyes = this.isBlueEyes();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "blueEyes", theBlueEyes), currentHashCode, theBlueEyes);
}
{
String theFamilyName;
theFamilyName = this.getFamilyName();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "familyName", theFamilyName), currentHashCode, theFamilyName);
}
{
String theGivenName;
theGivenName = this.getGivenName();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "givenName", theGivenName), currentHashCode, theGivenName);
}
{
List<String> theMiddleInitials;
theMiddleInitials = (this.isSetMiddleInitials()?this.getMiddleInitials():null);
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "middleInitials", theMiddleInitials), currentHashCode, theMiddleInitials);
}
{
String thePostCode;
thePostCode = this.getPostCode();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "postCode", thePostCode), currentHashCode, thePostCode);
}
{
boolean theSingle;
theSingle = this.isSingle();
currentHashCode = strategy.hashCode(LocatorUtils.property(locator, "single", theSingle), currentHashCode, theSingle);
}
return currentHashCode;
}
public int hashCode() {
final HashCodeStrategy strategy = JAXBHashCodeStrategy.INSTANCE;
return this.hashCode(null, strategy);
}
}
私のハメ撮りから、 "戦略的" バージョンは、より強力です。クラスは、ロケータとハッシュコード/イコール戦略を受け入れるHashCode
またはEquals
インターフェイスを実装しています。これにより、ハッシュコードの計算や外部からの比較を制御することができます。私は、2つのオブジェクトが等しいかどうかをチェックするだけでなく、正確にどこが異なるかを調べるために単体テストでこれを使用します。
両方のプラグインはリフレクションフリーメソッドを生成します(これはパフォーマンスにとって重要です)。また、JAXBElement
などのJAXB特殊ケース、プリミティブ配列なども考慮します。
ありがとうございますが、ちょっと混乱しました.jaxbの代わりにjaxbbasicsを使用するのですか? –
JAXB2 BasicsはJAXB/XJC用のプラグインのセットです。代わりに*使用することはできません。* JAXB/XJCで*使用する必要があります。 – lexicore
私のクラスはすでにuniqueIdフィールドを持っていますので、そのフィールドを使ってequalsとhashcodeを生成する方法があります。 –
http://stackoverflow.com/questions/6523497/how-to-generate-equals-and-hashcode-methods-using-wsimport-in-jaxws –
の可能な複製方法に基づいてメソッドを作成したいからですすべての要素を調べるのではなく、クラスの特定の要素。今のところ、私が使用している解決策は、常に上記のIDに基づいてカスタムコンパレータでTreeSetを使用することです。 –