【发布时间】: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 < data.length; i++) { res.push(data[i][0]); } mc.setPayloadJSON(res);吗?
标签: javascript iterator wso2 wso2esb