【问题标题】:JAXB objects - hashcode and equalsJAXB 对象 - 哈希码和等于
【发布时间】:2011-10-14 18:04:36
【问题描述】:

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

大多数情况下,在将数据从 db 访问填充到 JAXB java 对象中之后,我将不得不进行一些处理,例如“根据属性对对象集合进行排序”,找到 avg,对列表进行一些计算集合中的对象等。

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

问题:

1) jaxb 对象是否支持等于 /hashcode/ compareTo - 我可以在架构中指定这些吗?

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

谢谢。

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    看来您需要使用Collections.sort(list, Comparable) 来完成您想要的排序。等于和哈希码对您提到的任何一种情况都没有帮助,因为您的情况依赖于特定属性的比较,而不是整个对象。

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

    【讨论】:

    • 这是替换 compareTo 的好主意。但我的问题不仅仅是排序。我做了所有类型的处理,比如构建这些对象的嵌套树,我需要将它们放入 hashmap 等。我还需要有 hashcode 和 equals 的解决方法;
    • 这与您的实际问题不同。您还必须进一步定义嵌套树的要求,以解释需要覆盖 equals/hashcode。到目前为止,您说您需要覆盖,但没有给出任何充分的理由。
    【解决方案3】:

    FWIW,虽然 JAXB 生成的 Java 类没有等号和哈希码,但您可以在使用 JAXB 注释编写的类中添加这些覆盖 - JAXB 将忽略这些方法。

    【讨论】:

    • 我可能不清楚——我的意思是带注释的类也可以有equals和hashcode,而不是可以使用注释添加equals和hashcode。
    【解决方案4】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多