我正在使用的代碼使用從org.codehaus.mojo
從XSD模式生成Java類。我正在尋找一種方法來自動實現這些類的equals()
和hashCode()
方法,但似乎沒有辦法。我知道還有其他的JAXB2 Maven插件可以做到這一點(例如http://confluence.highsource.org/display/J2B/Home),但我想知道您之前是否有人遇到過這個問題,以及是否有辦法修復它。我使用xjc
目標生成類。當使用Mojo Jaxb2 maven插件創建Java類時,生成hashCode()和equals()
回答
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插件的配置支持。
我強烈反對在代碼中使用JAXB生成的類作爲業務對象。由JAXB生成的類是僅僅意味着將元素信息從xml文件移動到bean的字段的bean。我個人總是讓我的SOAP服務將這些生成的bean類轉換爲我的實際業務對象,因爲XML-> Java反之亦然,轉換並非始終是黑白的。請注意,這是我個人的觀點,並且希望其他人能夠評估他們在這種情況下所做的工作。
要回答你的問題,請使用不同的插件,或者只是使用IDE來製作一些equals和hashCode方法。
希望有所幫助。
編輯:
我忘了把我的推理爲此,道歉。讓我們說在您的項目的下一個版本中,您希望爲JAXB生成的類添加更多的行爲,但也希望對模式進行一些更改。現在,您正在重新生成JAXB生成的類,將舊的行爲重新放回原處,並使我的意見中的應用程序更容易受到錯誤的影響。 JAXB生成的類應該反映您的XML模式類型(以及您的SOAP消息)而不是您的業務邏輯。希望這是有道理的。
如果您引用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代的自動化構建過程中發生這種情況,我可以非常煩瑣嗎?
我的答案是那些誰負擔不起任何第三部分依賴他們生成的代碼。
的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的策略,他們的工具非常強大,我可能只是在嘗試使用大錘來攻擊一個堅果。不過,我很遺憾地注意到,爲我的情況找到合適的工具非常困難。
重要的是要說和orromda插件一起使用的選項是'-Xcommons-lang'。 – logoff 2014-01-15 11:27:07
這是最簡單的方法。請根據您的要求更新版本。
<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>
還爲JAXB一口流利的建設者插件,這並不一定產生依賴於第三方的代碼。另外,它是一個真正的「Builder」設計模式,而「fluent-api」插件只是將生成器類的方法添加到生成的類中。 它是:https://github.com/mklemm/jaxb2-rich-contract-plugin 它也有使生成的類不可變的選項,它可以生成方法將現有對象的狀態複製到新的構建器實例中,同時支持「部分」對象複製。
- 1. Intellij插件生成getter/setter,hashcode/equals,toString
- 2. 使用equals()和hashCode()方法從DTD生成Java類
- 3. Mojo schemagen maven插件錯誤地生成類
- 4. Java - equals和hashcode
- 5. JAXB2,Maven插件
- 6. JAXB2:每個命名空間創建單獨的directorie使用maven-JAXB2-插件從1.0xsd文件生成
- 7. 是否可以使用Mojo的Hibernate插件生成Annotated Java類?
- 8. Maven的Maven jaxb2插件
- 9. @overriding的equals()和hashCode()的Java類
- 10. 重寫equals和hashCode的Java
- 11. 無法使用codehaus.mojo創建java類jaxb2-maven-plugin
- 12. Java:自動equals()和hashCode()
- 13. Java equals()和hashCode()的變化
- 14. Map HashCode和Equals
- 15. 如何使用gradle生成來自WSDL和XSD的類,相當於maven-jaxb2-plugin
- 16. Overrding equals和hashCode
- 17. jaxb2-maven插件與JUnit4的集成
- 18. 我如何使用CXF生成equals和hashCode xjcplugin
- 19. 如何在jaxws中使用wsimport生成equals()和hashcode()方法
- 20. 如何讓Hibernate Tools使用toString,equals和hashcode生成POJO?
- 21. 跳過使用JAXB2 Maven插件
- 22. JAXB maven插件不生成類
- 23. maven插件 - jaxb - 創建JAXB類
- 24. 想要在由jaxb2-maven-plugin生成的類中生成@XmlRootElement
- 25. 的SAXParseException與jdk8和Maven的JAXB2-插件
- 26. Maven的JAXB2-插件無法生成WSDL架構
- 27. 的Maven插件JAXB2錯誤
- 28. 使用來自WSDL的jaxb2-maven-plugin生成類
- 29. apt Maven插件無法生成Q類
- 30. 如何在jaxb2-maven-plugin version 2中從WSDL創建類java?
我真的去了!謝謝:) – manub 2012-02-06 15:24:25
你確定這個工作嗎?我得到了「無法執行目標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
@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