Проблема wso2esb с повторным посредником
Я довольно новичок в WSO2 и XML/XPath, и у меня возникают проблемы с работой итеративного выражения посредника. Мой сценарий следующий. Мне дан файл.csv, который затем преобразуется в XML с помощью посредника Smooks и простого преобразования XSLT - оба из них работают нормально, я проверял их ранее. Результат этого процесса имеет следующую структуру (и помещается в среду SOAP с помощью esb):
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Orderlist xmlns="http://ws.apache.org/ns/synapse">
<Order>
<Nr>1234</Nr>
<Sender>
<!-- some child elements here -->>
</Sender>
<Recipient>
<!-- some child elements here -->
</Recipient>
</Order>
<Order> <!-- same as above -->
</Order>
<!-- more orders here -->
</Orderlist>
</soapenv:Body>
</soapenv:Envelope>
Теперь я использую следующий прокси для выполнения моих преобразований, а затем перебираю элементы Order:
<proxy name="Aufgabe3Proxy" startOnLoad="true" trace="disable"
transports="https http vfs" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<!-- transformations are done here, producing the above message -->
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<log level="full"/>
<aggregate>
<onComplete expression="//Orderlist">
<property name="transport.vfs.ReplyFileName" scope="transport"
type="STRING" value="responses-out.xml"/>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<send/>
</onComplete>
</aggregate>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.FileURI">file://C:\Users\admin\Desktop\Daten\MapsPaare\in</parameter>
<parameter name="transport.vfs.ContentType">text/plain</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file://C:\Users\admin\Desktop\Daten\MapsPaare\fail</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.csv</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file://C:\Users\admin\Desktop\Daten\MapsPaare\out1</parameter>
</proxy>
Когда я запускаю это и помещаю свой.csv в папку, в журнале печатается только прочитанное сообщение и результат преобразований, но не более того. Также он не записывает файл Responses-out.xml (и не создает его). Можете ли вы указать мне на ошибки, которые я делаю здесь?
Изменить: вещь, которую я до сих пор пробовал, так как: поскольку ESB помещает мой список заказов в пространство имен, я попытался настроить свое итеративное выражение следующим образом:
<iterate expression="$body/OL:Orderlist/OL:Auftrag" preservePayload="true"
xmlns:OL="http://ws.apache.org/ns/synapse">
Однако при запуске журнала выдается сообщение об ошибке: "SynapseXPath Оценка выражения XPath $body/OL:Auftragsliste/OL:Auftrag вызвала ошибку" и указывает, что не удалось разрешить префикс пространства имен OL.
2 ответа
Просто чтобы получить четкий ответ: решение было таким, как я написал в комментарии выше. Замена
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
с
<iterate xmlns:OL="http://ws.apache.org/ns/synapse" expression="//OL:Orderlist/OL:Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="//OL:Order/OL:Start"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="//OL:Order/OL:Ziel"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
действительно исправил проблему.
То, что вы попробовали в своем редактировании, это хороший способ сделать. Не знаю, почему узел 'order' становится 'Auftrag', но эта итерация должна работать:
<iterate expression="$body/OL:Orderlist/OL:Order" preservePayload="true" xmlns:OL="http://ws.apache.org/ns/synapse">
Убедитесь, что ошибка в журнале ESB не связана с другой частью вашего посредничества