当我无法访问unmarshaller时,如何调试JAXB解组?

时间:2012-02-22 18:05:41

标签: java jaxb unmarshalling

我遇到了JAXB unmarshalling的问题,我不知道如何解决。它涉及解组SOAP标头。在我的SOAPHandler中,我有一个SOAPMessageContext对象,其中有一个getHeaders()方法。此方法将QNameJAXBContext作为参数,并自动解组任何匹配的标头。

我的问题是我传递了相应的标题,但是unmarshalled对象被返回为空(即:所有字段都为空)。

我有点难过,因为我无法控制任何解组;我无法设置验证器(并查看是否存在架构问题)或其他任何事情,因为一切都发生在“黑匣子”中。我所能传递的只是该方法的JAXBContext

即使没有抛出异常,我还能做些什么来弄清楚为什么解组会失败?

谢谢,

埃里克

1 个答案:

答案 0 :(得分:0)

好的 - 所以在经过一番头疼之后,我意识到我可以尝试自己复制getHeaders()方法,并在unmarshaller上启用验证/等,以找出问题所在。

我最终使用以下内容将标头解压缩为xml节点:

        SOAPHeader soapHeader = context.getMessage().getSOAPHeader();
        Object z;
        XMLUtil xmlUtil = new XMLUtil();
        for( Iterator<SOAPElement> it = soapHeader.getChildElements(new ObjectFactory().createServiceContext(null).getName()); it.hasNext(); ){
            SOAPElement sc = it.next();
            z = xmlUtil.unmarshall(sc, ServiceContextType.class);
        }

在我的xmlUtil类中,我可以创建自己的JAXB unmarshaller并启用模式验证,而不仅仅依靠getHeaders()方法为我做神奇的事情。

希望这对其他人有帮助。

谢谢,

埃里克