После прочтения WSO2 EI References я все еще не понимаю, как использовать итераторы внутри последовательности EI. В моем случае у меня такая полезная нагрузка....
{
...
"array": [
{"cpf": "12345678911"},
{"cnpj":"12345678912346"}
]
}
Поэтому мне нужно повторить, чтобы проверить, существуют ли эти ребята, используя другие веб-сервисы. для достижения этого потока я использую итеративный посредник для разделения сообщения, а затем строю логику для выполнения этих проверок следующим образом.
Код, реализующий это изображение, следующий:
<iterate description="" expression="//jsonObject/array" id="myid">
<target>
<sequence>
<property expression="json-eval($.array.cpf)" name="tipoCPF" scope="default" type="STRING"/>
<filter description="" xpath="boolean(get-property('tipoCPF'))">
<then>
<property expression="json-eval($.array.cpf)" name="uri.var.cpf" scope="default" type="STRING"/>
<call>
<endpoint>
<http method="get" uri-template="http://endpoint/service/{uri.var.cpf}"/>
</endpoint>
</call>
<filter regex="200" source="get-property('axis2','HTTP_SC')">
<then/>
<else>
<payloadFactory description="" media-type="json">
<format>{
"code":"400",
"error":"CPF inexistente"
}</format>
<args/>
</payloadFactory>
<property name="HTTP_SC" scope="axis2" type="STRING" value="400"/>
<respond/>
</else>
</filter>
</then>
<else>
<property expression="json-eval($.array.cnpj)" name="tipoCNPJ" scope="default" type="STRING"/>
<filter xpath="boolean(get-property('tipoCNPJ'))">
<then>
<property expression="json-eval($.array.cnpj)" name="uri.var.cnpj" scope="default" type="STRING"/>
<header name="Authorization" scope="transport" value="Basic Y29yZS5jb25zdWx0aW5nOm8xNXRyZWI="/>
<call>
<endpoint>
<http method="get" uri-template="http://endpoint/service/cnpj/{uri.var.cnpj}"/>
</endpoint>
</call>
<filter regex="200" source="get-property('axis2','HTTP_SC')">
<then/>
<else>
<payloadFactory media-type="json">
<format>{
"code":"400",
"error":"CNPJ inexistente"
}</format>
<args/>
</payloadFactory>
<property name="HTTP_SC" scope="axis2" type="STRING" value="400"/>
<respond/>
</else>
</filter>
</then>
<else>
<call>
<endpoint>
<http method="get" uri-template="http://endpoint/service/info"/>
</endpoint>
</call>
</else>
</filter>
</else>
</filter>
</sequence>
</target>
</iterate>
Этот итератор работает как часть «непоследовательности». «Непоследовательность» позволяет вставлять информацию о новых контрактах в базу данных.
Проблема: после добавления этого итератора служба начинает дублировать вставки в базу данных. Похоже, что итерация не заканчивается на краю тегов «итератор». Это похоже на то, что итерация продолжается до остальной части непоследовательности. Попробуйте. Чтобы решить эту проблему, я пытаюсь добавить агрегатор-посредник после итератора. Но или не имеет никакого эффекта, чтобы дублированная вставка сохранялась, или я получаю сообщение об ошибке.
Итак, как правильно проводить эти итерации внутри WSO2 EI?