2011-10-14 29 views
12

Tenemos una gran aplicación Java que funciona completamente basada en la serialización JAXB. El servidor middleware hace todo el acceso db y envía todos los objetos de datos en objetos JAXB y serializa a XML y envía los datos a la IU (C# .Net).Objetos JAXB - hashcode e igual a

La mayoría de las veces después de que los datos se completan desde el acceso db a los objetos JAXB java, tendré que procesar algo como "ordenar la colección de objetos según el atributo", encontrar la media, hacer algunos cálculos en la lista de objetos en la colección, etc.

Mi problema principal es que los objetos JAXB no tienen iguales ni hashcode. Entonces, lo que estoy haciendo es mover todos los datos a algunos objetos de datos definidos por el usuario donde tengo hashcode, equals, compareTo defined para poder hacer todas las operaciones en las colecciones y luego copiar a los objetos JAXB. Creo que esto es un gasto adicional.

Preguntas:

1) hace objetos jaxb apoyo es igual a/código hash/compareTo - puedo specifiy éstos en el esquema?

2) ¿Alguna otra alternativa mejor?

Gracias.

Respuesta

10

lamentablemente, jaxb no proporciona esto de la caja. puede usar this plugin, o escribir uno propio para un comportamiento más personalizable.

+0

+1 para la introducción de este complemento. Voy a darle una oportunidad. –

+1

plug-in ha cambiado de ubicación: https://github.com/highsource/maven-jaxb2-plugin/wiki/Using-JAXB-Plugins – WhiteKnight

+0

@WhiteKnight actualizada, gracias – jtahlborn

3

Parece que necesita utilizar Collections.sort(list, Comparable) para realizar la ordenación que desea. Equals y hashcode no ayudarán en ninguno de los casos que mencionó, ya que sus casos se basan en la comparación de atributos específicos, no en el objeto como un todo.

Los otros casos de encontrar promedios y realizar cálculos tampoco tienen nada que ver con equals/hashcode que puedo ver. Estas operaciones simplemente requerirían analizar las listas y realizar su algoritmo apropiado.

+0

Esta es una buena idea para reemplazar el compareTo. Pero mi problema no es solo clasificar. Hago todo tipo de procesamiento como construir un árbol anidado de estos objetos en las que necesito para ponerlos en HashMap etc. Necesito tener solución para hashcode e iguala así; –

+0

Este es un escenario diferente al de su pregunta real. También debería definir más los requisitos para su árbol anidado que explican la necesidad de anular equals/hashcode. Hasta ahora usted está diciendo que usted necesita para anular, pero no ha dado ninguna buena razón por qué. – Robin

2

FWIW, mientras que las clases Java generadas por JAXB no tendrán iguales y hashcode, puede agregar estas modificaciones en las clases que escribe con anotaciones JAXB. JAXB ignorará los métodos.

+0

1 que es un buen punto. lo intentaré con anotaciones. –

+1

que puede haber sido unclear- que significaba que las clases con anotaciones también pueden tener iguales y código hash, no es igual que el código hash y se pueden agregar mediante anotaciones. –

0

maven-jaxb2-plugin puede generar código hash y es igual método que utiliza su propio plugin: org.jvnet.jaxb2_commons. Se pueden encontrar más detalles sobre la configuración here.

Las partes pertinentes de la pom.xml son los siguientes:

<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> 
Cuestiones relacionadas