2012-06-20 12 views
10

Ich verwende JAXB XMLadapter, um boolesche Werte zu marshalieren und zu entfernen. Auf die XML-Datei der Anwendung wird auch von der C# -Anwendung zugegriffen. Wir müssen diese XML-Datei validieren, und dies geschieht mit XSD. C# -Anwendung schreibt "True" -Wert für boolesche Knoten. Aber das Gleiche wird von unserem XSD bestätigt, da es nur "wahr/falsch" oder "1/0" erlaubt. Also haben wir String für boolesche Werte in XSD behalten und dieser String wird von XMLAdapter validiert, um auf unserer Seite marshalen und unmarshalen zu können. Der XML-Adapter ist wie folgt: JAXB XMLAdapter-Methode löst keine Ausnahme aus

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

Der obige Code in normalen Bedingungen funktioniert, aber wenn ungültige Daten (zB: "abcd" oder "") aus XML-Datei gelesen wird, dann ist die „throw new Exception(); " wird nicht weitergegeben und der Unmarshal-Prozess wird fortgesetzt, um den nächsten Knoten zu lesen. Ich möchte, dass die Anwendung beendet wird, sobald eine Ausnahme ausgelöst wird. Es scheint, dass meine Ausnahme weg gegessen wird. Jede Hilfe wird sehr geschätzt.

Wie wird das Problem gelöst?

Antwort

17

Vom JavaDoc von XMLAdapter#unmarshal(ValueType):

Wirft: java.lang.Exception - wenn ein Fehler bei der Umsetzung gibt. Der Anrufer ist verantwortlich für , der dem Benutzer den Fehler über ValidationEventHandler meldet.

Also, ja - die Ausnahme ist gegessen und berichtet dann ValidationEventHandler verwenden, nicht an die Spitze des Stapels geworfen.

Überprüfen Sie, ob Sie bereits jede (custom, vielleicht) verwenden ValidationEventHandler die Gruppen Ihre Ausnahmen oder DefaultValidationEventHandler verwenden, wie folgt aus:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

Es wird unmarshalling Versagen beim ersten Fehler verursachen.

+0

Vielen Dank @ npe: Das hat funktioniert ..! :) wusste nicht viel über ValidationEventHandler(), aber Ihre Zeiger auf JavaDoc halfen sehr. Nur Einstellung unmarshaller.setEventHandler (new DefaultValidationEventHandler()); hat die Arbeit .. Kennzeichnung Ihrer Lösung als eine Antwort .. Prost ..! –