问题描述
描述:我正在尝试使用 wso2 3.2 api 管理器中的脚本中介将 xml 转换为 json。我面临的问题是脚本中介方法 getPayloadXML() 无法从 xml 中提取特定值,它总是返回为 ReferenceError: "code" is not defined。我尝试了多种方法,但无法弄清楚如何实现这一目标。任何人的帮助都会非常可观。
响应调解
<sequence xmlns="http://ws.apache.org/ns/synapse" name="transform">
<script language="js"><![CDATA[
var envelope = mc.getPayloadXML()..*::fault-code.toString()
var request ={"data":{"success":"true","message":"SuccessFull","faultcode":envelope}};
mc.setPayloadJSON(request);
]]></script>
<log level="full">
<property name="Message" value="UpdatedMessage"/>
</log>
<property name="HTTP_SC" value="200" scope="axis2" />
<property name="messageType" value="application/json" scope="axis2"/>
</sequence>
原始回复
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<wsa:MessageID>210419-BA7CF-32444</wsa:MessageID>
<wsa:RelatesTo>Test123456</wsa:RelatesTo>
<wsa:To>http://www.w3.org/2005/08/addressing/anonymous</wsa:To>
<wsa:From>
<wsa:Address>some data</wsa:Address>
</wsa:From>
<wsa:Action>some data</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<cbo:response xmlns:abr="url" xmlns:asic="url" client-reference1="A1" response-type="error" version="1.2">
<cbo:error>
<cbo:fault-code>CBox017</cbo:fault-code>
<cbo:fault-string>User account is inactive.</cbo:fault-string>
<cbo:fault-actor/>
<cbo:detail/>
</cbo:error>
</cbo:response>
</soapenv:Body>
</soapenv:Envelope>
预期响应(转换为 JSON)
{
"data": {
"success": "true","message": "SuccessFull","faultcode":CBox017
}
}
错误日志
TID: [-1234] [] [2021-04-19 16:14:41,259] ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} - {api:admin--equifaxACNCheck:v1.0.0} The script engine returned an error executing the inlined js script function mediate com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: ReferenceError: "code" is not defined. (<UnkNown Source>#2) in <UnkNown Source> at line number 2
at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
at javax.script.CompiledScript.eval(CompiledScript.java:92)
at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlinescript(ScriptMediator.java:395)
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.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate_aroundBody0(apimanagerExtensionHandler.java:73)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate(apimanagerExtensionHandler.java:58)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse_aroundBody4(apimanagerExtensionHandler.java:132)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse(apimanagerExtensionHandler.java:120)
at org.apache.synapse.rest.API.process(API.java:371)
at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144)
at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:60)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:583)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:197)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:285)
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)
Caused by: org.mozilla.javascript.EcmaError: ReferenceError: "code" is not defined. (<UnkNown Source>#2)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3750)
at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1728)
at org.mozilla.javascript.gen._UnkNown_Source__2233._c_script_0(<UnkNown Source>:2)
at org.mozilla.javascript.gen._UnkNown_Source__2233.call(<UnkNown Source>)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen._UnkNown_Source__2233.call(<UnkNown Source>)
at org.mozilla.javascript.gen._UnkNown_Source__2233.exec(<UnkNown Source>)
at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55)
... 25 more
TID: [-1234] [] [2021-04-19 16:14:41,267] ERROR {API_LOGGER.admin--equifaxACNCheck} - The script engine returned an error executing the inlined js script function mediate com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.EcmaError: ReferenceError: "code" is not defined. (<UnkNown Source>#2) in <UnkNown Source> at line number 2
at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
at javax.script.CompiledScript.eval(CompiledScript.java:92)
at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlinescript(ScriptMediator.java:395)
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.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate_aroundBody0(apimanagerExtensionHandler.java:73)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.mediate(apimanagerExtensionHandler.java:58)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse_aroundBody4(apimanagerExtensionHandler.java:132)
at org.wso2.carbon.apimgt.gateway.handlers.ext.apimanagerExtensionHandler.handleResponse(apimanagerExtensionHandler.java:120)
at org.apache.synapse.rest.API.process(API.java:371)
at org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy(RESTRequestHandler.java:144)
at org.apache.synapse.rest.RESTRequestHandler.identifyAPI(RESTRequestHandler.java:164)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:60)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:331)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:583)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:197)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:285)
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)
Caused by: org.mozilla.javascript.EcmaError: ReferenceError: "code" is not defined. (<UnkNown Source>#2)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665)
at org.mozilla.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3750)
at org.mozilla.javascript.ScriptRuntime.name(ScriptRuntime.java:1728)
at org.mozilla.javascript.gen._UnkNown_Source__2233._c_script_0(<UnkNown Source>:2)
at org.mozilla.javascript.gen._UnkNown_Source__2233.call(<UnkNown Source>)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen._UnkNown_Source__2233.call(<UnkNown Source>)
at org.mozilla.javascript.gen._UnkNown_Source__2233.exec(<UnkNown Source>)
at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55)
... 25 more
解决方法
看起来 ScriptMediator
在解析 fault-code
时有问题。我认为这是因为连字符 -
在 JavaScript 和 E4X 中已经有意义。也许您可以使用 PayloadFactory
替代中介,如下所示:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="transform">
<payloadFactory media-type="json">
<format>{"data":{"success":"$1","message":"$2","faultcode":"$3"}}</format>
<args>
<arg literal="false" value="true"/>
<arg literal="false" value="SuccessFull"/>
<arg evaluator="xml" expression="//*:fault-code"
literal="false" xmlns:ns="http://org.apache.synapse/xsd"/>
</args>
</payloadFactory>
<log level="full">
<property name="Message" value="UpdatedMessage"/>
</log>
<property name="HTTP_SC" value="200" scope="axis2" />
</sequence>
应该不需要 <property name="messageType" value="application/json" scope="axis2"/>
,因为负载工厂应该设置它。