【问题标题】:How to convert list of list response of wso2 aggregate mediator into single list如何将 wso2 聚合调解器的列表响应列表转换为单个列表
【发布时间】:2021-09-03 05:05:24
【问题描述】:

我试图将我的列表聚合响应列表转换为单个列表。我尝试使用 js 脚本调解器。但它不支持,因为我有非常大的数据列表。

这是我的迭代和聚合函数。

   <iterate id="iterate-over-users" expression="json-eval($.pages)">
        <target sequence="backendcall-seqence" />
    </iterate>
    <aggregate id="iterate-over-users">
        <completeCondition>
            <messageCount min="-1" max="-1" />
        </completeCondition>
        <onComplete expression="json-eval($.rawData)" sequence="out-sequence">
            <respond />
        </onComplete>
   </aggregate>

我的结果是,

<script language="js">
        <![CDATA[
        data = JSON.parse(mc.getProperty("data"))
        res = [];
        data = mc.getPayloadJSON();
        for (i = 0; i < data.length; i++) {
            res=res.concat(data[i]);
        }
        mc.setPayloadJSON(res);
        ]]>
    </script>
    <property expression="json-eval($.)" name="data" scope="default" />

当数据 lis 很大时,它会从 js 函数中抛出和数组。

ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} - The script engine returned an Exception executing the external js script : null function mediate java.lang.IllegalArgumentException: out of range index
    at org.mozilla.classfile.ClassFileWriter.add(ClassFileWriter.java:579)
    at org.mozilla.classfile.ClassFileWriter.addLoadConstant(ClassFileWriter.java:647)
    at org.mozilla.classfile.ClassFileWriter.addPush(ClassFileWriter.java:884)
    at org.mozilla.javascript.optimizer.Codegen.emitConstantDudeInitializers(Codegen.java:1038)
    at org.mozilla.javascript.optimizer.Codegen.generateCode(Codegen.java:321)
    at org.mozilla.javascript.optimizer.Codegen.compileToClassFile(Codegen.java:166)
    at org.mozilla.javascript.optimizer.Codegen.compile(Codegen.java:75)
    at org.mozilla.javascript.Context.compileImpl(Context.java:2377)
    at org.mozilla.javascript.Context.compileReader(Context.java:1296)
    at org.mozilla.javascript.Context.compileReader(Context.java:1268)
    at org.mozilla.javascript.Context.evaluateReader(Context.java:1107)
    at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:172)
    at com.sun.phobos.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:198)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at org.apache.synapse.mediators.bsf.ScriptMediator.processJSONPayload(ScriptMediator.java:417)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:389)
    at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:290)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:258)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.apache.synapse.mediators.eip.aggregator.AggregateMediator.completeAggregate(AggregateMediator.java:512)
    at org.apache.synapse.mediators.eip.aggregator.AggregateMediator.mediate(AggregateMediator.java:351)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
    at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:194)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:267)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:807)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:305)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:578)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:195)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:284)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我的后端响应类似于,

{
   "a":"a",
   "b":"b",
   "rawData":[
     {'a1':12,'b1':'sd'},
    {'a1':12,'b1':'sd'}
    ]
}

在汇总我的回复后,

[
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]
]

但我需要回应的是,

[
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]

请任何人都可以帮助我。

【问题讨论】:

  • res.concat(data[i]); concat 不会更改现有数组,我认为mc.setPayloadJSON(res); 应该返回一个空数组,对吧?还是你忘了更新你的js代码?
  • 对不起,我忘了放,这里的问题是,由于我的列表很大,它不能使用这个逻辑之王,有没有针对这个的 wso2 解决方案
  • 你的意思是这里不能用js而是换成wso2的方案?
  • 由于我的列表很大,我们不能使用 js 解决方案,聚合函数中是否有任何可能的方法来处理这个问题。我现在也提出了我的错误
  • 你能先在你的js代码中试试这个const res = []; const data = mc.getPayloadJSON(); for (let i = 0; i &lt; data.length; i++) { res.push(data[i][0]); } mc.setPayloadJSON(res); 吗?

标签: javascript iterator wso2 wso2esb


【解决方案1】:

这里不需要ise 脚本中介。因为我们可以简单地使用表达式将列表列表转换为单个列表,

json-eval($.AllData[*][*])

这里 AllData 是您的列表的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-10-18
    相关资源
    最近更新 更多