我们有一个巨大的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)还有其他更好的选择吗?
感谢。
答案 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>