【问题标题】:How to debug JAXB unmarshalling when I have no access to the unmarshaller?当我无法访问解组器时如何调试 JAXB 解组?
【发布时间】:2012-02-23 03:31:54
【问题描述】:
我遇到了 JAXB 解组的问题,我不知道如何解决。它与解组 SOAP 标头有关。在我的SOAPHandler 中,我有一个SOAPMessageContext 对象,它有一个getHeaders() 方法。此方法接受 QName 和 JAXBContext 作为参数,并将自动解组任何匹配的标头。
我的问题是我传递了适当的标头,但未编组的对象返回为空(即:所有字段均为空)。
我有点难过,因为我无法控制任何解组;我无法设置验证器(并查看是否存在架构问题)或其他任何事情,因为一切都发生在“黑匣子”中。我只能将JAXBContext 传递给该方法。
即使没有抛出异常,我还能做些什么来弄清楚为什么解组失败?
谢谢,
埃里克
【问题讨论】:
标签:
java
jaxb
unmarshalling
【解决方案1】:
好的 - 经过一番摸索后,我意识到我可以尝试自己复制 getHeaders() 方法并在解组器上启用验证/等以找出问题所在。
我最终使用以下方法将标头提取为 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 解组器并启用模式验证,而不仅仅是依靠 getHeaders() 方法为我神奇地完成所有事情。
希望这对其他人有帮助。
谢谢,
埃里克