Подтвердить что ты не робот

Объекты JAXB - hashcode и равно

У нас есть огромное приложение java, которое полностью работает на основе сериализации JAXB. Сервер промежуточного программного обеспечения выполняет весь доступ к db и отправляет все объекты данных в объектах JAXB и сериализуется в XML и отправляет данные в UI (С#.Net).

В большинстве случаев, когда данные заполняются из доступа db к java-объектам JAXB, мне придется выполнить некоторую обработку, например "сортировать коллекцию объектов на основе атрибута", найти avg, выполнить некоторые вычисления в списке объекты в коллекции и т.д.

Моя основная проблема заключается в том, что объекты JAXB не имеют равных и hashcode. Так что я делаю перемещение всех данных в определенные пользователем объекты Data, где у меня есть hashcode, equals, compareTo, поэтому я могу выполнять все операции в коллекциях, а затем копировать объекты JAXB. Я думаю, что это дополнительные накладные расходы.

Вопросы:

1) поддерживает ли jaxb-объекты equals/hashcode/compareTo - могу ли я указать их в схеме?

2) Любые другие лучшие альтернативы?

Спасибо.

4b9b3361

Ответ 1

К сожалению, jaxb не предоставляет это из коробки. вы можете использовать этот плагин или написать свой собственный для более настраиваемого поведения.

Ответ 2

Похоже, вам нужно использовать Collections.sort(list, Comparable), чтобы выполнить сортировку, которую вы хотите. Равные и хэш-коды не помогут ни одному из случаев, о которых вы говорили, поскольку ваши дела полагаются на сравнение конкретных атрибутов, а не объекта в целом.

Другие случаи поиска средних и выполнения вычислений также не имеют ничего общего с equals/hashcode, которые я вижу. Эти операции просто потребовали бы разбора списков и выполнения соответствующего алгоритма.

Ответ 3

FWIW, тогда как Java-классы, созданные JAXB, не будут иметь равные и хэш-коды, вы можете добавить эти переопределения в классы, которые вы пишете с помощью аннотаций JAXB. JAXB будет игнорировать методы.

Ответ 4

maven-jaxb2-plugin может генерировать метод hashcode и equals с использованием собственного плагина: org.jvnet.jaxb2_commons. Более подробную информацию о конфигурации можно найти здесь.

Соответствующие части 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>