2012-01-05 13 views
13

Sto incontrando un problema con unMarshalling di JAXB. Penso di averlo codificato correttamente, ma il mio oggetto unmarshalled restituisce con parametri null. Di conseguenza, suppongo che quando non si esegue il riarmo, JAXB non stia vedendo la struttura XML appropriata che si aspetta. Tuttavia, non ricevo alcun messaggio di errore o eccezione generata.Come eseguire il debug di unMarshalling di JAXB?

Esiste comunque un passaggio nel processo di annullamento della memoria per vedere esattamente dove/perché non riesce a popolare il/i mio/i oggetto/i?

Il codice di deserializzazione reale è abbastanza banale:

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()); 
} 

Tuttavia, quando lo chiamo io, ho un oggetto di tipo restituito Clazz (come previsto), ma disabitata.

L'oggetto DOM che sto provando a unmarshal è generato da un'API di terze parti. Ho già incontrato alcuni comportamenti estremamente strani con l'unmarshalling, motivo per cui mi piacerebbe essere in grado di eseguire il debug del processo. Ad esempio, se provo a unmarshal un sottoelemento all'interno dell'oggetto DOM (ad esempio: doc.getByElementName ("myElement"). Item (0)), fallisce silenziosamente. Tuttavia, se converto il documento in una stringa e lo reimportiamo in un nuovo documento, lo converte correttamente.

Sto iniziando a diventare piuttosto frustrato non sapendo come eseguire il debug del problema.

Grazie per eventuali approfondimenti!

Eric

risposta

7

Un approccio che si potrebbe prendere è quella di utilizzare JAXB per generare uno schema XML dalle classi annotate. Questo rappresenta ciò che JAXB si aspetta che il documento di input assomigli. Quindi convalidare il documento XML con questo schema XML per vedere se è conforme alle aspettative di JAXB.

+0

Grazie per il link. Mai provato prima; gli daremo un colpo. Ma dato che ho generato le classi JAXB da un XSD, sembra di tornare indietro. Ma ancora non trovo che sia una soluzione elegante. JAXB si comporta come una scatola nera completa, e senza indicatori che spiegano cosa sta facendo, non ho idea di cosa sia il motivo per cui sta fallendo. Mi piacerebbe trovare un metodo per permettermi di "vedere" cosa sta facendo e/o dove si trovano i problemi. –

+0

Grazie per il suggerimento. Ho provato a utilizzare il validatore e sta generando un errore che non capisco. Ho creato un thread separato per questo (http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme). Se puoi suggerire qualcosa, lo apprezzerei molto. Grazie. –

+0

In effetti, questo è l'approccio migliore che ho trovato finora perché [altri approcci] (http://stackoverflow.com/a/10227684/1864054) semplicemente non producono risultati buoni e/o produttivi. Tuttavia, mi raccomando di non utilizzare 'soapUI' per generare messaggi di test poiché genera uno scheletro di messaggi senza alcun valore di dati (falsi), costringendo a digitare manualmente tutto ciò che è soggetto ad errori, specialmente per i messaggi di grandi dimensioni. Invece, XMLSpy di Altova fa miracoli. Tutto quello che devi fare è selezionare la voce 'create New SOAP request 'dal menu' SOAP' e, voilà !, hai un messaggio perfettamente funzionante (falso) – Withheld

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

Un commento o due su come questo snippet di codice risponde alla domanda essere utile. DefaultValidationEventHandler è il vecchio gestore JAXB 1.0 - giusto? Stai suggerendo questo come una risposta perché il vecchio gestore sputerebbe più messaggi di errore dettagliati? – Ryan

+0

Dalle javadocs: public class DefaultValidationEventHandler estende Object implementa ValidationEventHandler JAXB 1.0 solo difetto gestore di eventi di convalida. Questo è il gestore predefinito per tutti gli oggetti creati da un JAXBContext che gestisce il codice derivato dallo schema generato da un compilatore di bind JAXB 1.0. Questo gestore fa fallire le operazioni unmarshall e validate al primo errore o errore irreversibile. – superbAfterSemperPhi

Problemi correlati