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?
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 ..! –