2011-10-14 38 views
12

我們有一個完全基於作品JAXB serialization.The中間件服務器上完成所有數據庫訪問,並將在JAXB對象中的所有數據對象和序列化爲XML並將數據發送到UI(一個巨大的Java應用程序C#.NET)。JAXB對象 - 哈希碼和等於

大部分時間從數據庫訪問到JAXB java對象中填充數據後,我將不得不進行一些處理,如「根據屬性對對象集合進行排序」,找到平均值,在列表中進行一些計算對象集合等

我的主要問題是,JAXB對象沒有equals和hashcode。所以我正在做的是將所有數據移動到某些用戶定義的Data對象,在這些對象中我有hashcode,equals,compareTo定義,因此我可以在集合中執行所有操作,然後複製到JAXB對象。我認爲這是額外的開銷。

問題:

1)不JAXB對象的支持等於/哈希碼/的compareTo - 我可以在架構specifiy這些?

2)其他更好的選擇?

謝謝。

回答

10

不幸的是,jaxb不提供這種開箱即用的功能。您可以使用this plugin,或者編寫自己的更多自定義行爲。

+0

+1引入此插件。我會試一試。 –

+1

插件已更改位置:https://github.com/highsource/maven-jaxb2-plugin/wiki/Using-JAXB-Plugins – WhiteKnight

+0

@WhiteKnight更新,謝謝 – jtahlborn

3

它看起來像你需要做的使用Collections.sort(list, Comparable)來完成你想要的排序。因爲你的例子依賴於特定屬性的比較,而不是整個對象,所以Equals和hashcode對你提到的兩種情況都沒有幫助。

找到平均值和執行計算還什麼都沒有做與equals /哈希碼,我可以看到的其他情形。這些操作只需要解析列表並執行適當的算法。

+0

這是替換的compareTo一個好主意。但我的問題不僅僅是排序。我做了所有類似的處理,比如構建這些對象的嵌套樹,我需要把它們放在hashmap等中。我需要爲hashcode和equals創建解決方法; –

+0

這是與您的實際問題不同的場景。您還必須進一步定義您的嵌套樹的需求,以解釋需要覆蓋equals/hashcode。到目前爲止,你說的是你需要重寫,但是沒有給出任何充分的理由。 – Robin

2

FWIW,而JAXB生成的Java類不會有equals和hashCode,你可以添加你JAXB註釋寫的類,這些覆蓋 - JAXB將忽略該方法。

+0

+1這是一個很好的觀點。會嘗試使用註釋。 –

+1

我可能一直不清楚 - 我的意思是帶註釋的類也可以有equals和hashcode,不是等於,hashcode可以使用註釋來添加。 –

0

maven-jaxb2-plugin可以生成散列碼,等於用自己開發的插件方法:org.jvnet.jaxb2_commons。有關配置的更多詳細信息,請參閱here

pom.xml中的有關部分如下:

<project 
    <!-- other configuration --> 
    <dependencies> 
    <!-- other dependencies --> 
    <dependency> 
     <groupId>org.jvnet.jaxb2_commons</groupId> 
     <artifactId>jaxb2-basics</artifactId> 
     <version>0.11.0</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.13.1</version> 
     <executions> 
      <execution> 
      <id>generate</id> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <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.11.0</version> 
      </plugin> 
      </plugins> 
      <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory> 
      <cleanPackageDirectories>true</cleanPackageDirectories> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project>