JAXB XMLAdapter 方法不抛出异常

Posted

技术标签:

【中文标题】JAXB XMLAdapter 方法不抛出异常【英文标题】:JAXB XMLAdapter method does not throws Exception 【发布时间】:2012-06-22 06:53:11 【问题描述】:

我正在使用 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】:

来自XMLAdapter#unmarshal(ValueType)的JavaDoc:

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

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

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

unmarshaller.setEventHandler(new DefaultValidationEventHandler());

第一个错误会导致解组失败。

【讨论】:

谢谢@npe:那行得通..! :) 对 ValidationEventHandler() 知之甚少,但您对 JavaDoc 的指针帮助很大。只需设置 unmarshaller.setEventHandler(new DefaultValidationEventHandler());做的工作..将您的解决方案标记为答案..干杯..!

以上是关于JAXB XMLAdapter 方法不抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

如何从子方法中退出方法而不抛出异常

HttpClient.SendAsync 方法退出而不抛出异常

为啥不抛出异常的代码允许捕获已检查的异常?

如何不抛出一般指定的异常?

C++ STL栈问题:为啥栈为空时pop()不抛出异常?

有没有办法在不抛出异常的情况下转储堆栈跟踪?