我正在使用JAXB XMLadapter来编组和解组布尔值。应用程序的XML文件也将由C#应用程序访问。我们必须验证此XML文件,这是使用XSD完成的。 C#应用程序为布尔节点写入“True”值。但是我们的XSD也证实了这一点,因为它只允许“真/假”或“1/0”。因此,我们在XSD中保留了String的布尔值,XMLAdapter将验证该字符串,以便我们编组和解组。 XML Adapter如下:
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”或“”)时,则抛出“new new Exception();”没有传播,Unmarshal进程继续读取下一个节点。 我希望应用程序在抛出异常后立即停止。 看来我的异常被吃光了。 非常感谢任何帮助。
如何解决此问题?
答案 0 :(得分:26)
来自XMLAdapter#unmarshal(ValueType)
的JavaDoc:
抛出:
java.lang.Exception
- 如果转换过程中出现错误。调用者负责通过ValidationEventHandler 向用户报告错误。
所以,是的 - 例外 eaten 然后使用ValidationEventHandler
报告,而不是抛到堆栈的顶部。
检查您是否已经使用任何(可能是自定义的)ValidationEventHandler
对您的例外进行分组,或使用DefaultValidationEventHandler
,如下所示:
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
第一次错误会导致解组失败。