2016-03-17 6 views
2

Я использую IBM Integration Bus v9, и я пытаюсь получить DOM Node (org.w3c.dom.Node) из агрегированного сообщения, чтобы отменить его в Java-объект ,IIB - Получить узел DOM из агрегированного сообщения

В первой версии моего потока, я звонил только один веб-службы синхронно и с Java Compute Node, я получаю DOM документа непосредственно из MbMessage и демаршаллизации следующим образом (source):

MbMessage inMessage = inAssembly.getMessage(); 
JAXBElement<BefpDocData> inMsgJavaObj = jaxbContext.createUnmarshaller().unmarshal(inMessage.getDOMDocument(), BefpDocData.class); 
BefpDocData data = inMsgJavaObj.getValue(); 

Вторая версия моего потока теперь асинхронно вызывает два веб-сервиса и объединяет их с узлом 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(); 

Моя проблема IST, что getDomNode всегда возвращает нуль, несмотря на то, что docGenBefaXML точки на XMLNSC части сообщения. Я попытался вызвать метод getDomNode для разных элементов древовидной структуры, и он всегда возвращает null.

Структура агрегированного сообщения описана here.

Кто-нибудь знает, как это решить?

+0

Не уверен. Одна теория (и это всего лишь теория) заключается в том, что функция getDOMNode() не работает с агрегированными сообщениями. Возможно, стоит проверить документы для getDOMNode(). Если ничего не появится, откройте PMR и спросите IBM. – kimbert

+0

Вы пробовали переходить к корневым элементам ответа в DOM? Это может сработать. –

ответ

1

Спасибо за оба комментария, но мне нужно было сделать один шаг глубже в структуре (вплоть до сообщения, содержание тела), и это сработало. Но удивительно, что когда я пытался отобразить объект-узел в отладчике, он также отображался как нуль.

В этом случае, если кто-то должен делать то же самое, вот мой код:

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