我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们这边进行封送处理。XML适配器如下:
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(); } }
上面的代码在正常条件下有效,但是当从xml文件中读取无效数据(例如:“ abcd”或“”)时,则“抛出新的Exception();”。没有传播,解组进程继续读取下一个节点。我希望应用程序在引发异常后立即停止。看来我的例外被吞噬了。任何帮助深表感谢。
如何解决这个问题?
从JavaDoc的XMLAdapter#unmarshal(ValueType):
XMLAdapter#unmarshal(ValueType)
抛出: java.lang.Exception-如果转换期间发生错误。调用方负责 通过ValidationEventHandler向用户报告错误 。
java.lang.Exception
所以,是的- 吞噬 了异常,然后使用进行了报告ValidationEventHandler,而不是将其抛出堆栈顶部。
ValidationEventHandler
检查您是否已经在使用任何(可能是自定义的)ValidationEventHandler对异常进行分组的方法,或者使用DefaultValidationEventHandler,如下所示:
DefaultValidationEventHandler
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
遇到第一个错误将导致解组失败。