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

man*_*nub 9 java jaxb2 maven jaxb2-basics

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

lex*_*ore 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>
Run Code Online (Sandbox Code Playgroud)

我想问的是 - 为什么不使用maven-jaxb2-plugin?与Codehaus插件相比,它具有更多功能 - 包括对JAXB2插件的配置支持.

  • 你确定这个有效吗?我得到"无法在项目XXX上执行目标org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc(xjc):无法识别的参数-Xequals"或"找不到工件",具体取决于我使用的版本.至于其他插件,所有链接都被打破了. (2认同)

小智 6

这是最简单的方法。请根据您的要求更新版本。

<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>
Run Code Online (Sandbox Code Playgroud)


tha*_*guy 5

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

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

希望有所帮助.

编辑:

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