JAXB XMLAdapter 方法不引发异常

2022-09-02 20:58:05

我正在使用JAXB XMLadapter来封送和取消元帅布尔值。C# 应用程序也将访问应用程序的 XML 文件。我们必须验证这个XML文件,这是使用XSD完成的。C# 应用程序为布尔节点写入“True”值。但是,我们的 XSD 确实会验证这一点,因为它只允许“真/假”或“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”或“”)时,“throw new Exception();”不会传播,Unmarshal进程继续读取下一个节点。我希望应用程序在引发异常后立即停止。看来我的例外正在被蚕食。任何帮助都非常感谢。

如何解决此问题?


答案 1

From the JavaDoc of XMLAdapter#unmarshal(ValueType)

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

所以,是的 - 异常被吃掉,然后使用 ValidationEventHandler 报告,而不是抛到堆栈的顶部。

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

unmarshaller.setEventHandler(new DefaultValidationEventHandler());

它将导致在第一个错误时取消编组失败。


答案 2

推荐