2012-01-30 75 views
8

我正在使用的代碼使用從org.codehaus.mojo從XSD模式生成Java類。我正在尋找一種方法來自動實現這些類的equals()hashCode()方法,但似乎沒有辦法。我知道還有其他的JAXB2 Maven插件可以做到這一點(例如http://confluence.highsource.org/display/J2B/Home),但我想知道您之前是否有人遇到過這個問題,以及是否有辦法修復它。我使用xjc目標生成類。當使用Mojo Jaxb2 maven插件創建Java類時,生成hashCode()和equals()

回答

12

JAXB2您提到的基礎知識不是maven-jaxb2-plugin的屬性,它是一組獨立的JAXB 2.x插件,您可以使用XJC或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.11.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

我想問什麼 - 爲什麼不使用maven-jaxb2-plugin?與Codehaus插件相比,它具有更多的功能 - 包括對JAXB2插件的配置支持。

+0

我真的去了!謝謝:) – manub 2012-02-06 15:24:25

+1

你確定這個工作嗎?我得到了「無法執行目標org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc(xjc)on project XXX:unrecognized parameter -Xequals」或「Could not find artifact」,具體取決於我使用的版本。至於其他插件的所有鏈接都被破壞了。 – ampofila 2014-06-17 15:43:28

+0

@ampofila不,我不確定這個特定的XML,只有jaxb2-basics不依賴於任何特定的Maven插件。我只使用maven-jaxb2-plugin。該插件託管在中央Maven倉庫中,因此它肯定可用:http://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin我正在重新啓動文檔服務器。 – lexicore 2014-06-23 19:40:38

4

我強烈反對在代碼中使用JAXB生成的類作爲業務對象。由JAXB生成的類是僅僅意味着將元素信息從xml文件移動到bean的字段的bean。我個人總是讓我的SOAP服務將這些生成的bean類轉換爲我的實際業務對象,因爲XML-> Java反之亦然,轉換並非始終是黑白的。請注意,這是我個人的觀點,並且希望其他人能夠評估他們在這種情況下所做的工作。

要回答你的問題,請使用不同的插件,或者只是使用IDE來製作一些equals和hashCode方法。

希望有所幫助。

編輯:

我忘了把我的推理爲此,道歉。讓我們說在您的項目的下一個版本中,您希望爲JAXB生成的類添加更多的行爲,但也希望對模式進行一些更改。現在,您正在重新生成JAXB生成的類,將舊的行爲重新放回原處,並使我的意見中的應用程序更容易受到錯誤的影響。 JAXB生成的類應該反映您的XML模式類型(以及您的SOAP消息)而不是您的業務邏輯。希望這是有道理的。

+0

我同意這一點,而且我們有單獨的Business Objects。我需要的主要原因是編寫單元測試,但感謝提示! – manub 2012-01-31 09:59:53

+1

manub:您可以使用Apache Commons Lang的EqualsBuilder.reflectionEquals比較您的JAXB生成的類,而無需通過Maven插件添加hashCode和equals。 – 2013-04-30 14:37:05

+0

@ChrisEineke反思的所有表現處罰。 – lexicore 2015-01-23 13:38:54

2

如果您引用xmldsig-core-schema(您可能希望考慮使用fluent builder interface(便於處理生成的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核心-schema.xsd:http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd

請注意,該鏈接不破壞 - W3C服務器只是延遲了幾秒鐘的響應。如果在包含JAXB代的自動化構建過程中發生這種情況,我可以非常煩瑣嗎?

1

我的答案是那些誰負擔不起任何第三部分依賴他們生成的代碼。

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。取決於具體情況,這種依賴性可能更容易承受。

我終於找到了this source code,它可能包含在com.sun.xml.bind:jaxb-xjc(版本2.2.4?),但在此之前我看不到任何其他解決方案,而不是編寫自己的插件。

PS:我無法訪問confluence.highsource.org,我得到了404。我想這可能有幫助。

PPS:在我的情況下,我構建的應用程序針對的環境具有非常有限的一組允許的Java庫(不協調的安全限制)。我對jaxb2_commons在生成的源文件中包含一堆org.jvnet依賴關係這一事實感到有些失望,只是爲了添加一個無聊的方法equals。我可以理解jvnet的策略,他們的工具非常強大,我可能只是在嘗試使用大錘來攻擊一個堅果。不過,我很遺憾地注意到,爲我的情況找到合適的工具非常困難。

+0

重要的是要說和orromda插件一起使用的選項是'-Xcommons-lang'。 – logoff 2014-01-15 11:27:07

2

這是最簡單的方法。請根據您的要求更新版本。

<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> 
1

還爲JAXB一口流利的建設者插件,這並不一定產生依賴於第三方的代碼。另外,它是一個真正的「Builder」設計模式,而「fluent-api」插件只是將生成器類的方法添加到生成的類中。 它是:https://github.com/mklemm/jaxb2-rich-contract-plugin 它也有使生成的類不可變的選項,它可以生成方法將現有對象的狀態複製到新的構建器實例中,同時支持「部分」對象複製。

相關問題