IIB - 从聚合消息中获取 DOM 个节点
IIB - Get DOM Node from aggregated Message
我目前正在使用 IBM Integration Bus v9,我正在尝试从聚合消息中获取 DOM 节点 (org.w3c.dom.Node) 以将其解组为 Java 对象。
在我的流程的第一个版本中,我只同步调用一个 Web 服务,并且从 Java 计算节点,我直接从 MbMessage 获取 DOM 文档并解组以下方式 (source):
MbMessage inMessage = inAssembly.getMessage();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(inMessage.getDOMDocument(), BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();
我的流程的第二个版本现在异步调用两个 Web 服务并使用 AggregateReply 节点聚合它们。在这种情况下,我正在尝试这种方式:
MbMessage inMessage = inAssembly.getMessage();
MbElement comIbmAggregateReplyBody = inMessage.getRootElement().getFirstElementByPath("/ComIbmAggregateReplyBody");
MbElement docGenBefa = comIbmAggregateReplyBody.getFirstElementByPath("/ComIbmAggregateReplyBody/DocGenBefa");
MbElement docGenBefaXML = docGenBefa.getLastChild();
Node docGenBefaNode = docGenBefaXML.getDOMNode();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(docGenBefaNode, BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();
我的问题是 getDomNode 总是 returns null,尽管 docGenBefaXML 指向消息的 XMLNSC 部分。我尝试在树结构的各种元素上调用 getDomNode 方法,它总是 returns null。
描述了聚合消息的结构 here。
有人知道如何解决这个问题吗?
感谢这两条评论,但我不得不在结构上更深入一步(深入到 消息正文内容 )并且它起作用了。但令人惊讶的是,当我试图在调试器中显示节点对象时,它也显示为空。
在这种情况下,如果有人必须这样做,这是我的代码:
MbMessage inMessage = inAssembly.getMessage();
MbElement comIbmAggregateReplyBody = inMessage.getRootElement().getFirstElementByPath("/ComIbmAggregateReplyBody");
MbElement docGenBefa = comIbmAggregateReplyBody.getFirstElementByPath("/ComIbmAggregateReplyBody/DocGenBefa");
MbElement docGenBefaXML = docGenBefa.getLastChild();
MbElement docGenBefbDocData = docGenBefaXML.getLastChild();
Node docGenBefaNode = docGenBefbDocData.getDOMNode();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(docGenBefaNode, BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();
我目前正在使用 IBM Integration Bus v9,我正在尝试从聚合消息中获取 DOM 节点 (org.w3c.dom.Node) 以将其解组为 Java 对象。
在我的流程的第一个版本中,我只同步调用一个 Web 服务,并且从 Java 计算节点,我直接从 MbMessage 获取 DOM 文档并解组以下方式 (source):
MbMessage inMessage = inAssembly.getMessage();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(inMessage.getDOMDocument(), BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();
我的流程的第二个版本现在异步调用两个 Web 服务并使用 AggregateReply 节点聚合它们。在这种情况下,我正在尝试这种方式:
MbMessage inMessage = inAssembly.getMessage();
MbElement comIbmAggregateReplyBody = inMessage.getRootElement().getFirstElementByPath("/ComIbmAggregateReplyBody");
MbElement docGenBefa = comIbmAggregateReplyBody.getFirstElementByPath("/ComIbmAggregateReplyBody/DocGenBefa");
MbElement docGenBefaXML = docGenBefa.getLastChild();
Node docGenBefaNode = docGenBefaXML.getDOMNode();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(docGenBefaNode, BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();
我的问题是 getDomNode 总是 returns null,尽管 docGenBefaXML 指向消息的 XMLNSC 部分。我尝试在树结构的各种元素上调用 getDomNode 方法,它总是 returns null。
描述了聚合消息的结构 here。
有人知道如何解决这个问题吗?
感谢这两条评论,但我不得不在结构上更深入一步(深入到 消息正文内容 )并且它起作用了。但令人惊讶的是,当我试图在调试器中显示节点对象时,它也显示为空。
在这种情况下,如果有人必须这样做,这是我的代码:
MbMessage inMessage = inAssembly.getMessage();
MbElement comIbmAggregateReplyBody = inMessage.getRootElement().getFirstElementByPath("/ComIbmAggregateReplyBody");
MbElement docGenBefa = comIbmAggregateReplyBody.getFirstElementByPath("/ComIbmAggregateReplyBody/DocGenBefa");
MbElement docGenBefaXML = docGenBefa.getLastChild();
MbElement docGenBefbDocData = docGenBefaXML.getLastChild();
Node docGenBefaNode = docGenBefbDocData.getDOMNode();
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(docGenBefaNode, BefpDocData.class);
BefpDocData data = inMsgJavaObj.getValue();