2012-01-30 71 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 它也有使生成的类不可变的选项,它可以生成方法将现有对象的状态复制到新的构建器实例中,同时支持“部分”对象复制。

相关问题