JAXB XMLAdapter method does not throws Exception
java, jaxb, unmarshalling, xmladapter
Solution
From the JavaDoc of `XMLAdapter#unmarshal(ValueType)`:
Throws: `java.lang.Exception` - if there's an error during the conversion. The caller is responsible for reporting the error to the user through ValidationEventHandler.
So, yes - the exception is eaten and then reported using `ValidationEventHandler`, not thrown to the top of your stack.
Check if you are already using any (custom, perhaps) `ValidationEventHandler` that groups your exceptions, or use `DefaultValidationEventHandler`, like this:
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
It will cause unmarshalling failure on first error.
Problem
I am using JAXB XMLadapter to marshal and unmarshal Boolean values. The application's XML file will be accessed by C# application also. We have to validate this XML file and this is done using XSD. C# application writes "True" value for Boolean nodes. But the same does get validated by our XSD as it only allows "true/false" or "1/0". So we have kept String for boolean values in XSD and that string will be validated by XMLAdapter to marshal and unmarshal on our side. The XML Adapter is as follows: ``` 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(); } } ``` The code above works in normal conditions, but when invalid data(eg: "abcd" or "") is read from xml file then the "throw new Exception();" is not getting propagated and the Unmarshal process moves on to read next node. I want the application to stop as soon as an exception is thrown. It seems my Exception is getting eaten away. Any help is much appreciated. How to resolve this problem?