【问题标题】:IIB - Get DOM Node from aggregated MessageIIB - 从聚合消息中获取 DOM 节点
【发布时间】:2016-07-03 22:47:04
【问题描述】:

我目前正在使用 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 总是返回 null,尽管 docGenBefaXML 指向消息的 XMLNSC 部分。我尝试在树结构的各个元素上调用 getDomNode 方法,它总是返回 null。

聚合消息的结构描述为here

有人知道如何解决这个问题吗?

【问题讨论】:

  • 不确定。一个理论(这只是一个理论)是 getDOMNode() 函数不适用于聚合消息。可能值得检查 getDOMNode() 的文档。如果没有任何反应,请打开 PMR 并询问 IBM。
  • 您是否尝试过导航到 DOM 中的回复根元素?这可能行得通。

标签: java dom jaxb messagebroker


【解决方案1】:

感谢两位 cmets,但我必须在结构上更深入一步(深入到 消息正文内容)并且它起作用了。但令人惊讶的是,当我尝试在调试器中显示节点对象时,它也显示为 null。

在这种情况下,如果有人必须这样做,这是我的代码:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2012-05-14
    • 2012-05-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多