我正在使用的代码使用从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. JAXB2:每个命名空间创建单独的directorie使用maven-JAXB2-插件从1.0xsd文件生成
- 3. 是否可以使用Mojo的Hibernate插件生成Annotated Java类?
- 4. Java equals()和hashCode()的变化
- 5. Map HashCode和Equals
- 6. 如何使用gradle生成来自WSDL和XSD的类,相当于maven-jaxb2-plugin
- 7. Overrding equals和hashCode
- 8. jaxb2-maven插件与JUnit4的集成
- 9. 如何让Hibernate Tools使用toString,equals和hashcode生成POJO?
- 10. 想要在由jaxb2-maven-plugin生成的类中生成@XmlRootElement
- 11. 的SAXParseException与jdk8和Maven的JAXB2-插件
- 12. 的Maven插件JAXB2错误
- 13. apt Maven插件无法生成Q类
- 14. 如何在jaxb2-maven-plugin version 2中从WSDL创建类java?
- 15. 使用来自WSDL的jaxb2-maven-plugin生成类
- 16. 使用maven-plugin-plugin使用help-mojo阶段编译Maven插件
- 17. 使用org.jvnet.jaxb2.maven2为WSDL生成JAXB组件:maven-jaxb2-plugin
- 18. 忽略equals()和hashCode()在Java中
- 19. 的Maven插件JAXB不能生成目标文件夹类
- 20. Google App Engine,JDO和equals/hashCode
- 21. 使用java和maven在编译时生成类
- 22. 找不到文件:Maven的JAXB2-插件
- 23. 是否有Maven插件或mojo构建IntelliJ IDEA插件
- 24. 生成较大的HashCode JAVA
- 25. JAXB2 - Maven的插件上詹金斯
- 26. 何时覆盖hashcode和equals方法在java中
- 27. Maven maven-jaxb2-plugin和HTTP 302
- 28. 应该如何equals和hashCode使用JPA时和Hibernate
- 29. 使用自动生成的hibenate实体对象的ID在equals和hashCode方法
- 30. JAXB2 Maven插件不能读取配置
我真的去了!谢谢:) – 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