2010-04-13 8 views
18

Sto usando JAXB per unmarshal unmarshal un file XML in un albero di oggetti. L'oggetto radice non è nullo, ma tutti i membri sono nulli anche se nel file XML ci sono dati. Le mie classi di oggetti sono state generate con Axis2 da wsdls. Ho la classe ObjectFactory, la classe jaxb.index, l'annotazione package.info, eccUnMarshall JAXB creato un oggetto vuoto

Il mio problema è lo stesso di questo dibattito: http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

Prima di tutto: c'è un modo per farlo riempire i dati correttamente?

In caso contrario, c'è una buona libreria sostitutiva per Axis2 o JAXB che fa la stessa cosa ma che giocherà bene tra loro?

+0

Avremo bisogno di alcune classi JAXB e XML di esempio prima di poter rispondere. – skaffman

+0

Hai scoperto cosa ha causato questo problema? – Kimble

risposta

46

JAXB per impostazione predefinita ignora gli errori. Non riesco a vedere alcun motivo per cui questa è la configurazione predefinita. Prova ad aggiungere questo codice per generare un'eccezione se qualcosa va storto.

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

+10! Dopo un'ora di incessante colpo alla testa sono arrivato al tuo suggerimento. Grazie ... – Ittai

+0

Grande suggerimento. Vorrei comunque evitare di considerare gli sviluppatori JAXB come non molto buoni - gran parte di JAXB è stata scritta dal genio di Jenkins, Kohsuke Kawaguchi. Consentire un gestore di eventi collegabili consente una grande flessibilità (a un costo di semplicità). – JaysonRaymond

+2

@JaysonRaymond - Hai ragione, non dovrei usare quelle parole. Tuttavia, avendo appena scoperto che avevo sprecato due giorni di lavoro perché JAXB ignorava silenziosamente gli errori, a dir poco era frustrante. Io sostengo fermamente che questa non dovrebbe essere la configurazione di default, ma modifico il testo sulla mia risposta. –

0

Voglio solo aggiungere che quando Axis2 viene utilizzato insieme con Rampart (SOAP crittografia corpo) e JAXB, questo problema si verifica sempre.

Si veda per i dettagli: AXIS2-4981

1

Recentemente ho avuto simile tipo di problema, e potrebbe in grado di risolvere il problema come di seguito:

1) fixup il file XSD. Nel mio caso ho assicurato che tutti gli elementi complessi in xsd si riferivano al loro tipo corrispondente usando l'attributo ref, invece di dichiararli con l'attributo type.

Ho verificato se il mio xsd è corretto o meno creando un file xml dall'opzione file XML Schema in Eclipse.

Prima della correzione, l'elemento radice nel file xml era vuoto. Dopo aver corretto xsd, l'xml è stato creato correttamente con alcuni valori di esempio.

2) pulire e ricostruire È obbligatorio pulire prima di rigenerare le classi.

0

Il file package-info.java deve essere compilato. Eclipse deve trovare tutti i file .java e compilarli. Se si compila dalla riga di comando e si fa in modo che javac cerchi le dipendenze, NON lo troverà. Poi quando corri otterrai oggetti vuoti. Sembra un errore in JAXB non importare almeno quel file da qualche parte. E l'errore dovrebbe dirti di possibile compilare quel file.