2012-01-05 11 views
13

Tengo un problema con el desasignamiento de JAXB. Creo que lo he codificado correctamente, pero mi objeto no organizado vuelve con parámetros nulos. En consecuencia, estoy asumiendo que, al desasociar, JAXB no está viendo la estructura XML adecuada que está esperando. Sin embargo, no recibo ningún mensaje de error ni se lanzan excepciones.¿Cómo depurar el desasignamiento de JAXB?

¿Hay alguna forma de paso a través del proceso de desmaterialización para ver exactamente dónde/por qué no está completando mi objeto (s)?

El código unmarshalling real es bastante mundanas:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException { 
    // Creating an unmarshaller 
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller(); 

    // unmarshal an instance node into Java content 
    return clazz.cast(u.unmarshal(node, clazz).getValue()); 
} 

Sin embargo, cuando la llamo, me sale un objeto de tipo clazz devuelto (como se esperaba), pero no poblada.

El objeto DOM que intento anular es generado por una API de terceros. Ya me encontré con comportamientos extremadamente extraños con el desemparejamiento, por lo que me gustaría poder depurar el proceso. Por ejemplo, si trato de desempaquetar un subelemento dentro del objeto DOM (es decir: doc.getByElementName ("myElement"). Item (0)), falla silenciosamente. Sin embargo, si convierto el documento en una cadena y lo vuelvo a importar en un documento nuevo, entonces lo convierte bien.

Estoy empezando a sentirme bastante frustrado al no saber cómo solucionar este problema.

¡Gracias por cualquier idea!

Eric

Respuesta

7

Un enfoque que podría tomar es utilizar JAXB para generar un esquema XML a partir de sus clases anotadas. Esto representa lo que JAXB espera que sea el documento de entrada. Luego, valide su documento XML con este esquema XML para ver si cumple con las expectativas de JAXB.

+0

Gracias por el enlace. Nunca lo había intentado antes; le dará una oportunidad. Pero dado que generé las clases JAXB de un XSD, parece ir hacia atrás. Pero todavía no creo que sea una solución elegante. JAXB está actuando como una caja negra completa, y sin ningún indicador que explique lo que está haciendo, no tengo idea de por qué está fallando. Me encantaría encontrar un método que me permita "ver" qué está haciendo y/o dónde están los problemas. –

+0

Gracias por la sugerencia. Intenté usar el validador, y está arrojando un error que no entiendo. He creado un hilo separado para eso (http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme). Si puede sugerir algo, lo agradecería enormemente. Gracias. –

+0

De hecho, ese es el mejor enfoque que he encontrado hasta ahora porque [otros enfoques] (http://stackoverflow.com/a/10227684/1864054) simplemente no producen resultados buenos y/o productivos. Sin embargo, recomendaría no usar 'soapUI' para generar mensajes de prueba ya que genera un esqueleto de mensaje sin ningún valor de datos (falso), lo que le obliga a escribir manualmente todo lo que es propenso a errores, especialmente para mensajes grandes. En cambio, XMLSpy de Altova funciona de maravilla. Todo lo que tiene que hacer es seleccionar el elemento 'create New SOAP request 'del menú' SOAP' y, ¡listo !, tiene un mensaje perfectamente funcional (falso) – Withheld

10
JAXBContext context = JAXBContext.newInstance(jaxbObjectClass); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
+1

Un comentario o dos acerca de cómo este fragmento de código responde la pregunta ser útil. DefaultValidationEventHandler es el viejo controlador de JAXB 1.0 - ¿Está bien? ¿Está sugiriendo esto como una respuesta porque el manejador anterior escupiría más mensajes de error detallados? – Ryan

+0

De los javadocs: DefaultValidationEventHandler clase pública se extiende Objeto implementa ValidationEventHandler JAXB 1.0 sólo por defecto controlador de eventos de validación. Este es el controlador predeterminado para todos los objetos creados a partir de un JAXBContext que administra código derivado de esquema generado por un compilador de enlace JAXB 1.0. Este controlador hace que las operaciones unmarshal y de validación fallen en el primer error o error grave. – superbAfterSemperPhi