2012-06-20 10 views
10

Używam JAXB XMLadapter do marszałkowania i niemagania wartości logicznych. Dostęp do pliku XML aplikacji będzie również możliwy za pomocą aplikacji C#. Musimy sprawdzić poprawność tego pliku XML i odbywa się to za pomocą XSD. Aplikacja C# zapisuje wartość "True" dla węzłów Boolean. Ale to samo zostaje sprawdzone przez nasz XSD, ponieważ zezwala tylko na "true/false" lub "1/0". Tak więc zachowaliśmy ciąg dla wartości logicznych w XSD i ten ciąg będzie sprawdzany przez XMLAdapter, aby uzyskać marszałek i unmarshal po naszej stronie. Adapter XML jest następujący: Metoda JAXB XMLAdapter nie generuje wyjątku

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

Powyższy kod działa w normalnych warunkach, ale gdy nieprawidłowe dane (np: „abcd” lub „”) jest czytany z pliku xml a następnie „throw new Exception(); " nie jest propagowany i proces Unmarshal przechodzi do odczytu następnego węzła. Chcę, aby aplikacja zatrzymała się zaraz po zgłoszeniu wyjątku. Wygląda na to, że mój Wyjątek zostaje zjedzony. Każda pomoc jest doceniana.

Jak rozwiązać ten problem?

Odpowiedz

17

Z JavaDoc z XMLAdapter#unmarshal(ValueType):

Zgłasza: java.lang.Exception - jeśli wystąpi błąd podczas konwersji. Osoba wywołująca jest odpowiedzialna za zgłoszenie błędu użytkownikowi przez za pośrednictwem ValidationEventHandler.

Tak, tak - wyjątkiem jest spożywane a następnie zgłaszane przy użyciu ValidationEventHandler, nie rzucony na górze stosu.

Sprawdź, czy jesteś już przy użyciu dowolnego (na zamówienie, być może) ValidationEventHandler że grupach wyjątki lub użyj DefaultValidationEventHandler coś takiego:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

Spowoduje to unmarshalling awarii na pierwszym błędzie.

+0

Dziękuję @ npe: To zadziałało ..! :) nie wiedział dużo o ValidationEventHandler() ale twoje wskazówki do JavaDoc bardzo pomogły. Just setting unmarshaller.setEventHandler (new DefaultValidationEventHandler()); wykonała pracę .. Oznaczanie rozwiązania jako odpowiedź .. Pozdrawiam ..! –

Powiązane problemy