WSO2 APIM:mc.setPayloadJSON 抛出 org.mozilla.javascript.WrappedException

WSO2 APIM:mc.setPayloadJSON throwing org.mozilla.javascript.WrappedException

我正在尝试使用 Javascript 在 WSO2 APIM 中操纵 JSON 请求并将其作为 application/json 发送。我修改了 axis2.xml & axis2_blocking_client.xml 以包括 JsonStreamFormatter 和 JsonStreamBuilder。设置 mc.setPayloadJSON 时得到 org.mozilla.javascript.WrappedException。 以下是代码片段和错误日志:

API snippet(carbon.xml):

  <api context="/TestVDB/v1.0" name="creator--testVDB" version="v1.0" version-type="context">
        <resource faultSequence="fault" methods="POST" url-mapping="/VcVDB">
            <inSequence>
                <filter regex="PRODUCTION" source="$ctx:AM_KEY_TYPE">
                    <then>
                        <property action="remove"
                            name="REST_URL_POSTFIX" scope="axis2"/>
                        <property expression="json-eval($.)" name="JSONPayload"/>
                        <log level="custom">
                            <property
                                expression="get-property('JSONPayload')" name="requestJson"/>
                        </log>
                        <property name="action" value="SUBMIT"/>
                        <script language="js"><![CDATA[var requestJson=mc.getProperty('JSONPayload');
var requestJsonObject=JSON.parse(requestJson);
var requestJsonString=JSON.stringify(requestJsonObject);
var VDBJsonObj = new Object();
VDBJsonObj.inputJsonReq=requestJsonString;
newResponseJson=JSON.stringify(VDBJsonObj);
print(newResponseJson);
mc.setPayloadJSON(newResponseJson);]]></script>
                        <property name="HTTP_METHOD" scope="axis2"
                            type="STRING" value="POST"/>
                        <property name="messageType" scope="axis2" value="application/json"/>
                        <property
                            expression="get-property('SYSTEM_TIME')" name="api.ut.backendRequestTime"/>
                        <send>
                            <endpoint name="creator--testVDB_APIproductionEndpoint_0">
                                <http uri-template="{var.uri.host}.{var.uri.port}/FpuVDB/CallRouterView/json/CallRequestRouter"/>
                            </endpoint>
                        </send>
                    </then>
                    <else>
                        <sequence key="_sandbox_key_error_"/>
                    </else>
                </filter>
            </inSequence>
            <outSequence>
                <class name="org.wso2.carbon.apimgt.usage.publisher.APIMgtResponseHandler"/>
                <send/>
            </outSequence>
        </resource>
        <handlers>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.CORSRequestHandler">
                <property name="apiImplementationType" value="ENDPOINT"/>
            </handler>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler"/>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.throttling.APIThrottleHandler">
                <property name="id" value="A"/>
                <property name="policyKeyResource" value="gov:/apimgt/applicationdata/res-tiers.xml"/>
                <property name="policyKey" value="gov:/apimgt/applicationdata/tiers.xml"/>
                <property name="policyKeyApplication" value="gov:/apimgt/applicationdata/app-tiers.xml"/>
            </handler>
            <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageHandler"/>
            <handler class="org.wso2.carbon.apimgt.usage.publisher.APIMgtGoogleAnalyticsTrackingHandler">
                <property name="configKey" value="gov:/apimgt/statistics/ga-config.xml"/>
            </handler>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler"/>
        </handlers>
    </api>

错误日志:

[2016-05-10 07:49:17,340] DEBUG - headers http-incoming-6 >> POST /TestVDB/v1.0/VcVDB HTTP/1.1
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Host: 10.178.233.87:8245
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Connection: keep-alive
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Content-Length: 1885
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Cache-Control: no-cache
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Content-Type: application/json
[2016-05-10 07:49:17,341] DEBUG - headers http-incoming-6 >> Authorization: Bearer b51763484717d618473cc9662b237504
[2016-05-10 07:49:17,342] DEBUG - headers http-incoming-6 >> Postman-Token: 9ac93374-5fc7-3f01-1c2d-c23b4fefdecf
[2016-05-10 07:49:17,342] DEBUG - headers http-incoming-6 >> Accept: */*
[2016-05-10 07:49:17,342] DEBUG - headers http-incoming-6 >> Accept-Encoding: gzip, deflate
[2016-05-10 07:49:17,342] DEBUG - headers http-incoming-6 >> Accept-Language: en-US,en;q=0.8
[2016-05-10 07:49:17,350]  INFO - LogMediator requestJson = {
  "@context": "__http://etc.abc.com/metadata/context.jsonld",
  "@id": "__http://etc.abc.com/message/id/abc/Router/327a3063-ab17-48c5-e053-336edb20aae9",
  "@type": "msg:Message",
  "msg:format": "__http://etc.abc.com/data/voc/Formats/MessageFormat-1",
  "msg:type": "__http://etc.abc.com/data/voc/MessageTypes/ServiceCall-1",
  "msg:from": "__http://etc.abc.com/data/voc/Contributors/abc/pqr",
  "msg:to": "__http://etc.abc.com/data/voc/Contributors/abc/VirusCheck",
  "msg:service": {
    "@id": "__http://etc.abc.com/message/id/abc/Router/327a3063-ab18-48c5-e053-336edb20aae9",
    "@type": "msg:ServiceCall",
    "svc:time": "2016-05-10T05:52:05.029Z",
    "svc:type": "__http://etc.abc.com/data/voc/ServiceCall/PerformVirusCheck",
    "svc:about": "cert-s3-ucmdata-pqr",
    "svc:resource": [
      "https://s3-ucmdata-pqr.s3.amazonaws.com/EU_WEST_1-cert-s3-ucmdata-pqr-16f817e9f8eb07db4beb70e5d021d13c-63503_58484_99949.pdf?response-content-disposition=attachment%3B%20filename%3D%22EU_WEST_1-cert-s3-ucmdata-pqr-16f817e9f8eb07db4beb70e5d021d13c-63503_58484_99949.pdf%22&response-content-type=application%2Fpdf&AWSAccessKeyId=AKIAJTIYS75JIN6ZWRSQ&Expires=1473241925&Signature=cKyblhLqxS7KAH6k8Okca5BEjyk%3D"
    ],
    "svc:params": [
      {
        "@context": {
          "virus": "__http://etc.abc.com/data/ns/messages/abc/VirusCheckService-1/"
        },
        "virus:post-result-at": "https://s3-ucmdata-pqr.s3.amazonaws.com/VIRUS_EU_WEST_1-cert-s3-ucmdata-pqr-16f817e9f8eb07db4beb70e5d021d13c-63503_58484_99949.pdf?AWSAccessKeyId=FDSJTIYS75JIN6ZWRSQ&Expires=1473241925&Signature=ev44nf8MA4%2Fkfa9IRmonO8ANpMk%3D",
        "virus:remove-file-properties": true,
        "virus:and-again-please": null
      }
    ]
  },
  "@timestamp": "2016-05-10T05:52:05.029Z"
}
{"inputJsonReq":"{\"@context\":\"__http://etc.abc.com/metadata/context.jsonld\",\"@id\":\"__http://etc.abc.com/message/id/abc/Router/327a3063-ab17-48c5-e053-336edb20aae9\",\"@type\":\"msg:Message\",\"msg:format\":\"__http://etc.abc.com/data/voc/Formats/MessageFormat-1\",\"msg:type\":\"__http://etc.abc.com/data/voc/MessageTypes/ServiceCall-1\",\"msg:from\":\"__http://etc.abc.com/data/voc/Contributors/abc/pqr\",\"msg:to\":\"__http://etc.abc.com/data/voc/Contributors/abc/VirusCheck\",\"msg:service\":{\"@id\":\"__http://etc.abc.com/message/id/abc/Router/327a3063-ab18-48c5-e053-336edb20aae9\",\"@type\":\"msg:ServiceCall\",\"svc:time\":\"2016-05-10T05:52:05.029Z\",\"svc:type\":\"__http://etc.abc.com/data/voc/ServiceCall/PerformVirusCheck\",\"svc:about\":\"cert-s3-ucmdata-pqr\",\"svc:resource\":[\"https://cert-s3-ucmdata-pqr.s3.amazonaws.com/EU_WEST_1-cert-s3-ucmdata-pqr-16f817e9f8eb07db4beb70e5d021d13c-63503_58484_99949.pdf?response-content-disposition=attachment%3B%20filename%3D%22EU_WEST_1-cert-s3-ucmdata-pqr-16f817e9f8eb07db4beb70e5d021d13c-63503_58484_99949.pdf%22&response-content-type=application%2Fpdf&AWSAccessKeyId=AKIAJABCS75JIN6ZWRSQ&Expires=1473241925&Signature=cKyblhLqxS7KAH6k8njgf5BEjyk%3D\"],\"svc:params\":[{\"@context\":{\"virus\":\"__http://etc.abc.com/data/ns/messages/abc/VirusCheckService-1/\"},\"virus:post-result-at\":\"https://cert-s3-ucmdata-pqr.s3.amazonaws.com/VIRUS_EU_WEST_1-cert-s3-ucmdata-pqr-16f817eop8b07db4beb70e5d021d13c-63503_58484_99949.pdf?AWSAccessKeyId=AKIAJTXCV75JIN6ZWRSQ&Expires=1473241925&Signature=ev44nf8MA4%2Fkfa9IRdayO8ANpMk%3D\",\"virus:remove-file-properties\":true,\"virus:and-again-please\":null}]},\"@timestamp\":\"2016-05-10T05:52:05.029Z\"}"}
[2016-05-10 07:49:17,364] ERROR - ScriptMediator The script engine returned an error executing the inlined js script function mediate
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.WrappedException: Wrapped java.lang.IllegalStateException: Expected attribute value (<Unknown Source>#8) in <Unknown Source> at line number 8
        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:306)
        at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:245)
        at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:213)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
        at org.apache.synapse.mediators.filters.FilterMediator.mediate(FilterMediator.java:166)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:155)
        at org.apache.synapse.rest.Resource.process(Resource.java:297)
        at org.apache.synapse.rest.API.process(API.java:378)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:86)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:65)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:295)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:317)
        at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:363)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:142)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
Caused by: org.mozilla.javascript.WrappedException: Wrapped java.lang.IllegalStateException: Expected attribute value (<Unknown Source>#8)
        at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1754)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:148)
        at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:225)
        at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
        at org.mozilla.javascript.gen._Unknown_Source__91._c_script_0(<Unknown Source>:8)
        at org.mozilla.javascript.gen._Unknown_Source__91.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__91.call(<Unknown Source>)
        at org.mozilla.javascript.gen._Unknown_Source__91.exec(<Unknown Source>)
        at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:55)
        ... 24 more
Caused by: java.lang.IllegalStateException: Expected attribute value
        at org.apache.synapse.commons.staxon.core.json.JsonXMLStreamReader.consumeName(JsonXMLStreamReader.java:117)
        at org.apache.synapse.commons.staxon.core.json.JsonXMLStreamReader.consume(JsonXMLStreamReader.java:131)
        at org.apache.synapse.commons.staxon.core.json.JsonXMLStreamReader.consume(JsonXMLStreamReader.java:162)
        at org.apache.synapse.commons.staxon.core.json.JsonXMLStreamReader.consume(JsonXMLStreamReader.java:149)
        at org.apache.synapse.commons.staxon.core.json.JsonXMLStreamReader.consume(JsonXMLStreamReader.java:132)
        at org.apache.synapse.commons.staxon.core.base.AbstractXMLStreamReader.hasNext(AbstractXMLStreamReader.java:446)
        at org.apache.synapse.commons.staxon.core.base.AbstractXMLStreamReader.next(AbstractXMLStreamReader.java:456)
        at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:88)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
        at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
        at org.apache.axiom.om.impl.llom.OMElementImpl.buildNext(OMElementImpl.java:653)
        at org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122)
        at org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:343)
        at org.apache.axiom.om.impl.traverse.OMChildrenIterator.getNextNode(OMChildrenIterator.java:36)
        at org.apache.axiom.om.impl.traverse.OMAbstractIterator.hasNext(OMAbstractIterator.java:58)
        at org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:414)
        at org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:421)
        at org.apache.synapse.commons.json.JsonUtil.removeIndentations(JsonUtil.java:421)
        at org.apache.synapse.commons.json.JsonUtil.newJsonPayload(JsonUtil.java:530)
        at org.apache.synapse.commons.json.JsonUtil.newJsonPayload(JsonUtil.java:599)
        at org.apache.synapse.mediators.bsf.ScriptMessageContext.setPayloadJSON(ScriptMessageContext.java:628)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:126)
        ... 33 more
[
[2016-05-10 07:49:17,375]  INFO - LogMediator STATUS = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = The script engine returned an error executing the inlined js script function mediate
[2016-05-10 07:49:17,384] DEBUG - headers http-incoming-6 << HTTP/1.1 500 Internal Server Error
[2016-05-10 07:49:17,385] DEBUG - headers http-incoming-6 << Accept-Language: en-US,en;q=0.8
[2016-05-10 07:49:17,385] DEBUG - headers http-incoming-6 << Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type
[2016-05-10 07:49:17,385] DEBUG - headers http-incoming-6 << Access-Control-Allow-Origin: *
[2016-05-10 07:49:17,385] DEBUG - headers http-incoming-6 << Accept-Encoding: gzip, deflate
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Postman-Token: 9ac93374-5fc7-3f01-1c2d-c23b4fefdecf
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Access-Control-Allow-Methods: POST
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Content-Type: application/xml; charset=UTF-8
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Cache-Control: no-cache
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Date: Tue, 10 May 2016 11:49:17 GMT
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Transfer-Encoding: chunked
[2016-05-10 07:49:17,386] DEBUG - headers http-incoming-6 << Connection: keep-alive

当我们调用mc.setPayloadJSON(newResponseJson);它尝试在消息上下文中构建现有的有效载荷,并在设置修改后的有效载荷之前将其转换为 XML 格式。转换由 StAXON 库 [1] 完成。 StAXON 在进行转换时将“@”字段视为 XML 中的属性。 [2] [3] 例如: {"node": {"@attribute": "myAttrib"}} 表示为 关于 StAXON,您的有效负载中也存在两个问题,您也已经确定了。

  1. 它有以下带@字段的对象; StAXON 库不支持它,因为我们不能在 XML 属性中设置对象。
  2. @字段是在定义了JSON对象的普通字段后定义的("@timestamp": "2016-05-10T05:52:05.029Z")。 StAXON 也将此识别为问题。因为,在 XML 中,我们在开始定义它的 child/text 字段后没有指定属性。

为了缓解这个问题,我们需要避免构建现有消息并将其转换为 XML。为此,我们需要设置以下 属性 以在调用 mc.setPayloadJSON(newResponseJson);

之前从消息上下文中删除现有有效负载

mc.getEnvelope().getBody().getFirstElement().detach();