当前位置: 首页 > 知识库问答 >
问题:

JAXB XMLAdapter方法不引发异常

公德明
2023-03-14

我正在使用JAXB XMLadapter封送和反封送布尔值。应用程序的XML文件也将被C#应用程序访问。我们必须验证这个XML文件,这是使用XSD完成的。C#应用程序为布尔节点编写“true”值。但XSD也验证了这一点,因为它只允许“true/false”或“1/0”。因此,我们在XSD中保留了布尔值的String,该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();”未传播,反封送进程将继续读取下一个节点。我希望应用程序在抛出异常后立即停止。看来我的例外正在被蚕食。非常感谢任何帮助。

如何解决这个问题?

共有1个答案

蔡辰钊
2023-03-14

xmladapter#unmarshal(ValueType)的JavaDoc中:

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

因此,是的--该异常被吃了,然后使用validationeventhandler报告,而不是抛出到堆栈的顶部。

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

unmarshaller.setEventHandler(new DefaultValidationEventHandler());

它将在第一个错误时导致解组失败。

 类似资料:
  • 问题内容: 我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本

  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 问题内容: 这是我的代码块。 这段代码无法编译,因为我在Line1中添加了“ throws”。 编译器抱怨重写的方法不能引发异常。 为什么这样 ?。 为什么覆盖的方法不能引发异常? 因为我可以通过在子类的实现中添加n行代码来覆盖基类中的方法。 这些添加的代码会引发异常,所以为什么我不能在重写的方法中使用“引发”? 问题答案: 重写的方法可以引发Exception,只要被重写的方法也抛出相同的Exc

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行