2010-04-13 20 views
18

Estoy utilizando JAXB para desempaquetar un archivo XML en un árbol de objetos. El objeto raíz no es nulo, pero todos sus miembros son nulos aunque haya datos en el archivo XML. Mis clases de objetos se generaron con Axis2 desde wsdls. Tengo la clase ObjectFactory, la clase jaxb.index, la anotación package.info, etc.JAXB Unmarshall Creado un objeto vacío

Mi problema es el mismo que esta discusión: http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

En primer lugar: ¿Hay alguna manera de conseguirlo para llenar los datos correctamente?

Si no, ¿hay una buena biblioteca sustituta para Axis2 o JAXB que haga lo mismo pero que se jugará bien entre sí?

+0

Necesitaremos algunas muestras de clases de JAXB y XML antes de que podamos responder a esto. – skaffman

+0

¿Has descubierto qué causó este problema? – Kimble

Respuesta

46

JAXB ignora los errores de forma predeterminada. No veo ninguna razón por la cual esta es la configuración predeterminada. Intenta agregar este código para lanzar una excepción si algo sale mal.

unmarshaller.setEventHandler(
    new ValidationEventHandler() { 
     public boolean handleEvent(ValidationEvent event) { 
      throw new RuntimeException(event.getMessage(), 
             event.getLinkedException()); 
     } 
}); 
+3

+10! Después de una hora de ataques interminables de la cabeza, llegué a tu consejo. Gracias ... – Ittai

+0

Gran sugerencia. Sin embargo, advierto que no debo considerar a los desarrolladores de JAXB como no muy buenos: gran parte de JAXB fue escrita por el genio detrás de Jenkins, Kohsuke Kawaguchi. Permitir un controlador de eventos conectable permite una gran flexibilidad (a un costo de simplicidad). – JaysonRaymond

+2

@JaysonRaymond - Tienes razón, no debería usar esas palabras. Sin embargo, haber descubierto que había perdido dos días de trabajo porque JAXB ignoraba silenciosamente los errores era frustrante, por decir lo menos. Sostengo firmemente que esta no debería ser la configuración predeterminada, pero editaré la redacción de mi respuesta. –

0

Solo quiero agregar que cuando se usa Axis2 junto con Rampart (SOAP Body encryption) y JAXB, este problema ocurre siempre.

Ver para más detalles: AXIS2-4981

1

recientemente he tenido el mismo tipo de problema, y ​​podrían capaz de arreglarla de la siguiente manera:

1) Fixup el archivo xsd. En mi caso, me he asegurado de que todos los elementos complejos en xsd se refieran a su tipo correspondiente utilizando el atributo ref, en lugar de declararlos con el atributo de tipo.

He verificado si mi xsd es correcto o no al crear un archivo xml desde la opción de archivo de esquema XML en Eclipse.

Antes de la corrección, el elemento raíz en el archivo xml estaba vacío. Después de corregir el xsd, el xml se creó correctamente con algunos valores de muestra.

2) limpiar y reconstruir Es obligatorio limpiar antes de volver a generar las clases.

0

El archivo package-info.java debe estar compilado. Eclipse debe encontrar todos los archivos .java y compilarlos. Si compila desde la línea de comando y deja que javac busque dependencias, NO lo encontrará. Luego, cuando corras obtendrás objetos vacíos. Parece un error en JAXB para no importar al menos ese archivo en alguna parte. Y el error debería indicarle que es posible compilar ese archivo.

Cuestiones relacionadas