如何调试JAXB unmarshalling?

时间:2012-01-05 22:37:09

标签: debugging jaxb unmarshalling

我遇到了JAXB unmarshalling的问题。我想我已正确编码,但我的unmarshalled对象返回null参数。因此,我假设在解组时,JAXB没有看到它期望的适当的XML结构。但是,我没有收到任何错误消息或抛出任何异常。

无论如何都要逐步完成解组过程,看看它在哪里/为什么无法填充我的对象?

实际的解组代码相当普通:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException {
    // Creating an unmarshaller
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller();

    // unmarshal an instance node into  Java content
    return clazz.cast(u.unmarshal(node, clazz).getValue());
}

然而,当我调用它时,我得到一个返回类型clazz的对象(如预期的那样),但是没有填充。

我尝试解组的DOM对象是由第三方API生成的。我已经遇到了一些非常奇怪的解组行为,这就是为什么我希望能够调试这个过程。例如,如果我尝试解组DOM对象中的子元素(即:doc.getByElementName(“myElement”)。item(0)),它将无声地失败。但是,如果我将文档转换为字符串,并将其重新导入到新文档中,那么它就可以很好地转换它。

我开始变得非常沮丧,不知道如何调试这个问题。

感谢您的任何见解!

埃里克

3 个答案:

答案 0 :(得分:11)

JAXBContext context = JAXBContext.newInstance(jaxbObjectClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());

答案 1 :(得分:7)

您可以采用的一种方法是使用JAXB从带注释的类生成XML模式。这表示JAXB期望输入文档的外观。然后根据此XML模式验证XML文档,看它是否符合JAXB的期望。

答案 2 :(得分:1)

是否应该有其他人像我一样偶然发现这一点。 https://www.kevinhooke.com/2014/03/25/debugging-jaxb-unmarshalling-issues/

这篇博文很重要

将以下内容传递到您的启动命令中

-Djaxb.debug=true

然后添加以下 EventHandler。

Unmarshaller um = jaxbContext.createUnmarshaller();
um.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());

希望有帮助。在我的 jetty 网络应用程序中,这会导致明显的错误冒泡,而且我很容易发现命名空间问题。