JAXB XMLAdapter方法不会抛出exception

我正在使用JAXB XMLadapter来编组和解组布尔值。 应用程序的XML文件也将由C#应用程序访问。 我们必须validation此XML文件,这是使用XSD完成的。 C#应用程序为布尔节点写入“True”值。 但是我们的XSD也证实了这一点,因为它只允许“真/假”或“1/0”。 因此,我们在XSD中保留了String的布尔值,并且该字符串将由XMLAdaptervalidation,以便我们编组和解组。 XML Adapter如下:

public class BooleanAdapter extends XmlAdapter { @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(); } } 

上面的代码在正常情况下工作,但是当从xml文件中读取无效数据(例如:“abcd”或“”)时,则抛出“new new Exception();” 没有传播,Unmarshal进程继续读取下一个节点。 我希望应用程序在抛出exception后立即停止。 看来我的exception被吃光了。 任何帮助深表感谢。

如何解决这个问题?

来自XMLAdapter#unmarshal(ValueType)的JavaDoc:

抛出: java.lang.Exception – 如果在转换过程中出现错误。 调用者负责通过ValidationEventHandler向用户报告错误

所以,是的 – 了exception,然后使用ValidationEventHandler进行报告,而不是抛到堆栈顶部。

检查您是否已经使用任何(自定义的) ValidationEventHandler对您的exception进行分组,或使用DefaultValidationEventHandler ,如下所示:

 unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

它会在第一次错误时导致解组失败。