![](/img/trans.png)
[英]Generating and customizing equals/hashcode methods with CXF/JAXB2
[英]Generating hashCode() and equals() when creating Java classes using Mojo Jaxb2 maven plugin
我工作的代码是使用jaxb2-maven-plugin
从org.codehaus.mojo
产生从XSD架构的Java类。 我正在寻找一种方法来自动为这些类实现equals()
和hashCode()
方法,但似乎没有办法。 我知道还有其他JAXB2 Maven插件可以做到这一点(例如http://confluence.highsource.org/display/J2B/Home),但我想知道你们之前是否有人遇到过这个问题,如果有办法的话修理它。 我正在使用xjc
目标生成类。
您提到的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生成的类是bean,它们本质上是将元素信息从xml文件移动到bean的字段。 我个人总是让我的SOAP服务将这些生成的bean类转换为我的实际业务对象,因为XML-> Java,反之亦然,转换不是一直是黑白的。 请注意,这是我个人的观点,并希望其他人能够在这种情况下权衡他们的行为。
要回答你的问题,请使用不同的插件,或者只使用IDE来制作一些equals和hashCode方法。
希望有所帮助。
编辑:
道歉,我忘记了我的理由。 让我们说在项目的下一个版本中,您希望为JAXB生成的类添加更多行为,但也希望对模式进行一些更改。 现在,您正在重新生成JAXB生成的类,重新使用旧行为,并使您的应用程序更容易受到我认为的错误的影响。 JAXB生成的类应该反映您的XML模式类型(以及您的SOAP消息)而不是您的业务逻辑。 希望有道理。
您可能还需要考虑使用流畅的构建器接口 (便于处理生成的JAXB类)以及引用目录文件,以防您引用xmldsig-core-schema(加速生成过程,因为没有远程Schemas)从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-core-schema.xsd的链接: http : //www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd
请注意,链接没有被破坏 - W3C服务器只是将响应延迟几秒钟。 如果在自动构建过程中发生这种情况(包括JAXB生成),我会非常麻烦。
这是最简单的方法。 请根据您的要求更新版本。
<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>
我的答案是那些无法承担任何第三方依赖于他们生成的代码的人。
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
。 根据情况,这种依赖性可能更容易承受。
我终于找到了这个源代码 ,它可能在某些时候包含在com.sun.xml.bind:jaxb-xjc中(版本2.2.4?),但在那之前我看不到任何其他解决方案而不是编写自己的插件。
PS:我无法访问confluence.highsource.org ,我得到了404.我猜它可能会有所帮助。
PPS:在我的情况下,我正在构建的应用程序的目标是一个拥有非常有限的允许Java库集的环境(不一致的安全限制)。 我有点在于,失望jaxb2_commons
包括一堆org.jvnet
中生成的源的依赖关系,只是用于将一个无聊equals
方法。 我可以理解jvnet的策略,他们的工具非常强大,我可能只是尝试并使用大锤来破解坚果。 尽管如此,我很遗憾地注意到为我的情况找到合适的工具是如此困难。
JAXB还有一个流畅的构建器插件,它不一定会生成对第三方代码的依赖。 此外,它是一个真正的“构建器”设计模式,而“fluent-api”插件只是向生成的类添加类似构建器的方法。 它是: https : //github.com/mklemm/jaxb2-rich-contract-plugin它还有选项使生成的类不可变,它可以生成将现有对象的状态复制到新的构建器实例的方法,同时支持“部分”对象副本。
对我来说,最简单的方法是使用maven-jaxb2-plugin
(如接受的答案中所述):
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<generateDirectory>target/generated-sources</generateDirectory>
<generatePackage>my.package</generatePackage>
</configuration>
</execution>
</executions>
<configuration>
<extension>true</extension>
<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.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.