使用Mojo Jaxb2 maven插件创建Java类时生成hashCode()和equals()

时间:2012-01-30 10:37:19

标签: java maven jaxb2 jaxb2-basics

我正在处理的代码是使用jaxb2-maven-plugin中的org.codehaus.mojo从XSD架构生成Java类。我正在寻找一种方法来为这些类自动实现equals()hashCode()方法,但似乎没有办法。我知道还有其他JAXB2 Maven插件可以做到这一点(例如http://confluence.highsource.org/display/J2B/Home),但我想知道你们之前是否有人遇到过这个问题,如果有办法的话修理它。我正在使用xjc目标生成类。

7 个答案:

答案 0 :(得分:14)

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插件的配置支持。

答案 1 :(得分:5)

我强烈反对在代码中使用JAXB生成的类作为业务对象。 JAXB生成的类是bean,它们本质上是将元素信息从xml文件移动到bean的字段。我个人总是让我的SOAP服务将这些生成的bean类转换为我的实际业务对象,因为XML-&gt; Java反之亦然,转换不是黑白的。请注意,这是我个人的观点,并希望其他人能够在这种情况下权衡他们的行为。

要回答你的问题,请使用不同的插件,或者只使用你的IDE制作一些equals和hashCode方法。

希望有所帮助。

编辑:

我忘记了我的理由,道歉。让我们说在项目的下一个版本中,您希望为JAXB生成的类添加更多行为,但也希望对模式进行一些更改。现在,您正在重新生成JAXB生成的类,重新使用旧行为,并使您的应用程序更容易受到我认为的错误的影响。 JAXB生成的类应该反映您的XML模式类型(以及您的SOAP消息)而不是您的业务逻辑。希望这是有道理的。

答案 2 :(得分:2)

您可能还想考虑使用fluent builder interface(便于处理生成的JAXB类)以及引用目录文件,以防您引用xmldsig-core-schema(加快生成过程) ,因为没有查询来自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生成,那么我会非常麻烦。

答案 3 :(得分: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>

答案 4 :(得分: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的策略,他们的工具非常强大,我可能只是尝试并使用大锤来破解坚果。尽管如此,我很遗憾地注意到找到适合我情况的合适工具非常困难。

答案 5 :(得分:1)

还有一个用于JAXB的流畅的构建器插件,它不一定会生成对第三方代码的依赖性。此外,它是一个真正的“构建器”设计模式,而“fluent-api”插件只是向生成的类添加类似构建器的方法。 它是:https://github.com/mklemm/jaxb2-rich-contract-plugin 它还具有使生成的类不可变的选项,并且它可以生成将现有对象的状态复制到新构建器实例的方法,还支持“部分”对象复制。

答案 6 :(得分:0)

对我来说,最简单的方法是使用maven-jaxb2-plugin(如已接受的答案所述):

  1. 添加pom.xml <dependencies>
<dependency> 
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>
  1. 添加插件
<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>

请参见

相关问题