Диспетчер api wso2 преобразование json в xml (и сбой запроса)

Мы используем диспетчер API WSO2 в качестве шлюза API. Один из имеющихся у меня API - это не полностью успокаивающий API только для JSON. Он использует запросы HTTP POST с JSON в качестве формата обмена данными. У меня для этого очень простая конфигурация: настроен как REST API с разрешенным POST / *.

Некоторые из ответов включают JSON, в котором есть такие строки, как "P~A", в качестве ключей объекта. Когда я пытаюсь вызвать это через шлюз, он подавляется ответом:

2018-09-13 18:37:37,890 [-] [PassThroughMessageProcessor-36] ERROR JsonUtil #writeAsJson. Could not convert OMElement to JSON. Invalid XML payload. Error>>> Unexpected character '~' (code 126) excepted space, or '>' or "/>"
 at [row,col {unknown-source}]: [1,4956]
2018-09-13 18:37:37,891 [-] [PassThroughMessageProcessor-36] ERROR PassThroughHttpSSLSender Failed to submit the response
org.apache.axis2.AxisFault: Could not convert OMElement to JSON. Invalid XML payload.
        at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:372)
        at org.apache.synapse.commons.json.JsonFormatter.writeTo(JsonFormatter.java:84)
        at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:573)
        at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:264)
        at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
        at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:230)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:531)
        at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:118)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.rest.Resource.process(Resource.java:343)
        at org.apache.synapse.rest.API.process(API.java:338)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:90)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:56)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304)
        at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554)
        at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:262)
        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: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '~' (code 126) excepted space, or '>' or "/>"
 at [row,col {unknown-source}]: [1,4956]
        at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
        at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2996)
        at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2963)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2839)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1073)
        at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
        at javax.xml.stream.util.StreamReaderDelegate.next(Unknown Source)
        at org.codehaus.stax2.ri.Stax2ReaderAdapter.next(Stax2ReaderAdapter.java:129)
        at org.codehaus.stax2.ri.Stax2EventReaderImpl.peek(Stax2EventReaderImpl.java:367)
        at org.apache.synapse.commons.staxon.core.event.SimpleXMLEventWriter.add(SimpleXMLEventWriter.java:118)
        at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:368)
        ... 23 more
2018-09-13 18:37:37,892 [-] [PassThroughMessageProcessor-36] ERROR Axis2Sender Access-Control-Allow-Headers:authorization,Access-Control-Allow-Origin,Content-Type,SOAPAction,Access-Control-Allow-Methods:HEAD,DELETE,POST,PATCH,PUT,GET,Access-Control-Allow-Origin:*,Content-Type:application/json;charset=utf-8,<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject>

(затем он продолжает и включает XML, который пытается использовать ключи "P~A" из JSON в качестве тегов XML <P~A>, что и подавляется)

В определении API для нет включена передача сообщений, а также отключено кеширование ответов. Итак, я не понимаю, почему он вообще использует посредник и вообще пытается преобразовать мой ответ JSON в XML.

Итак, вопрос: как заставить это работать? Либо настроив его на преобразование в XML, либо не нужно?

Также отмечу, что что-то в этом процессе занимает много времени. Прежде чем я получу ответ (ошибка), проходит очень много времени, но я вижу, что данные ответа быстро поступают в диспетчер API.

У нас также работает служба WSO2 Analytics. Я попытался остановить это на случай, если это вызывало проблему. Не помогло

0
0
785
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отправляю это как ответ, потому что это решает проблему. Добавлять

synapse.commons.json.buildValidNCNames=true

В файл repository/conf/synapse.properties.

Это заставляет его справляться с ~ (и всем остальным, что недопустимо в теге), используя коды символов.

Я предполагаю, что посредничество может быть не посредничеством сообщений (которое было отключено), а чем-то более внутренним. В этом случае я действительно не понимаю, почему вышеуказанный параметр не является значением по умолчанию - я не вижу в этом недостатка, и без него шлюз не может справиться с определенным JSON!

Другие вопросы по теме