我正在使用JAXB
XMLadapter来组织和解组布尔值.应用程序的XML文件也将被C#应用程序访问.我们必须验证这个XML文件,这是使用XSD完成的. C#应用程序为布尔节点写入“True”值.但是,我们的XSD的验证是相同的,因为它只允许“true / false”或“1/0”.所以我们在XSD中保留了String的布尔值,并且该字符串将被XMLAdapter验证,以组织和解组.
XML适配器如下所示:
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”或“”)时,“throw new Exception();”没有被传播,Unmarshal进程继续读取下一个节点.
一旦抛出异常,我希望应用程序停止.
看来我的异常被吃掉了.
任何帮助深表感谢.
如何解决这个问题?
解决方法
从
XMLAdapter#unmarshal(ValueType)
的JavaDoc:
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.
所以,是的 – 异常被吃掉,然后报告使用ValidationEventHandler
,而不是抛到你的堆栈的顶部.
检查您是否已经使用任何(自定义或许)ValidationEventHandler来组合您的异常,或使用DefaultValidationEventHandler
,如下所示:
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
第一个错误会导致解组失败.