JAXB对象 - 哈希码和等号

时间:2011-10-14 18:04:37

标签: java jaxb

我们有一个巨大的Java应用程序,它完全基于JAXB序列化。中间件服务器完成所有数据库访问并发送JAXB对象中的所有数据对象并序列化为XML并将数据发送到UI(C#.Net)。 / p>

数据从db访问到JAXB java对象后的大部分时间,我都要进行一些处理,比如“根据属性对对象集合进行排序”,找到avg,在列表中做一些计算集合中的对象等。

我的主要问题是,JAXB对象没有equals和hashcode。所以我正在做的是将所有数据移动到一些用户定义的数据对象,其中我有hashcode,equals,compareTo定义,所以我可以在集合中执行所有操作,然后复制到JAXB对象。我认为这是一个额外的开销。

问题:

1)jaxb对象是否支持equals / hashcode / compareTo - 我可以在模式中指定这些吗?

2)还有其他更好的选择吗?

感谢。

4 个答案:

答案 0 :(得分:10)

不幸的是,jaxb没有提供开箱即用的功能。您可以使用this plugin,或编写自己的行为以获得更多可自定义的行为。

答案 1 :(得分:3)

您似乎需要使用Collections.sort(list, Comparable)来完成所需的排序。由于您的案例依赖于特定属性的比较而不是整个对象,因此Equals和hashcode对您提到的任何一种情况都无济于事。

查找平均值和执行计算的其他情况也与我可以看到的equals / hashcode无关。这些操作只需要解析列表并执行适当的算法。

答案 2 :(得分:2)

FWIW,虽然JAXB生成的Java类不具有equals和hashcode,但您可以在使用JAXB注释编写的类中添加这些覆盖 - JAXB将忽略这些方法。

答案 3 :(得分:0)

maven-jaxb2-plugin可以使用自己的插件生成hashcode和equals方法:org.jvnet.jaxb2_commons。有关配置的更多详细信息,请参见here

pom.xml的相关部分如下:

<project
  <!-- other configuration -->
  <dependencies>
    <!-- other dependencies -->
    <dependency>
      <groupId>org.jvnet.jaxb2_commons</groupId>
      <artifactId>jaxb2-basics</artifactId>
      <version>0.11.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.13.1</version>
        <executions>
          <execution>
            <id>generate</id>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <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.0</version>
            </plugin>
          </plugins>
          <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
          <cleanPackageDirectories>true</cleanPackageDirectories>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>