2012-06-20 16 views
10

Sto utilizzando JAXB XMLadapter per i valori booleani di marshall e unmarshal. Il file XML dell'applicazione sarà accessibile anche dall'applicazione C#. Dobbiamo convalidare questo file XML e questo viene fatto usando XSD. L'applicazione C# scrive il valore "True" per i nodi booleani. Ma lo stesso viene convalidato dal nostro XSD in quanto consente solo "vero/falso" o "1/0". Quindi abbiamo mantenuto String per i valori booleani in XSD e quella stringa sarà convalidata da XMLAdapter per maresciallo e unmarshal dalla nostra parte. L'adattatore XML è la seguente: Il metodo JAXB XMLAdapter non genera Eccezione

public class BooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
@Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if(v.equalsIgnoreCase("true") || v.equals("1")) 
     { 
      return true; 
     } 
     else if(v.equalsIgnoreCase("false") || v.equals("0")) 
     { 
      return false; 
     } 
     else 
     { 
      throw new Exception("Boolean Value from XML File is Wrong."); 
     } 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     return v.toString();   
    } 
} 

Il codice precedente funziona in condizioni normali, ma quando i dati non validi (ad esempio: "ABCD" o "") vengono letti dal file XML poi il "gettare nuova eccezione(); " non viene propagato e il processo Unmarshal passa a leggere il prossimo nodo. Voglio che l'applicazione si fermi non appena viene lanciata un'eccezione. Sembra che la mia eccezione si sta consumando. Qualsiasi aiuto è molto apprezzato.

Come risolvere questo problema?

risposta

17

Dal JavaDoc di XMLAdapter#unmarshal(ValueType):

Produce: java.lang.Exception - se c'è un errore durante la conversione. Il chiamante è responsabile di segnalando l'errore all'utente tramite ValidationEventHandler.

Quindi, sì - l'eccezione è mangiato e poi riportato utilizzando ValidationEventHandler, non torta alla parte superiore del tuo stack.

Controllare se si sta già utilizzando qualsiasi (su misura, forse) ValidationEventHandler che raggruppa le vostre eccezioni, o usano DefaultValidationEventHandler, in questo modo:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

Sarà causare insufficienza unmarshalling al primo errore.

+0

Grazie @npe: Che ha funzionato ..! :) non sapeva molto di ValidationEventHandler() ma i tuoi riferimenti a JavaDoc hanno aiutato molto. Basta impostare unmarshaller.setEventHandler (new DefaultValidationEventHandler()); ha svolto il lavoro .. Contrassegnare la soluzione come risposta .. Cheers ..! –

Problemi correlati