WSO2 MI – 无法在处理base64编码的载荷时写入JSON流

后端开发 2026-07-11

我正在使用 WSO2 Micro Integrator,并暴露一个PATCH API,用于接收一个 JSON载荷中的base64文档,然后把它转发给后端服务。

<resource methods="PATCH" uri-template="/uploadDocuments">
    <inSequence>
        <log category="INFO" level="custom">
            <property name="[UPLOADING DOCUMENT]" value="[STARTED]" />
        </log>

        <sequence key="ApiKeySequence" />

        <propertyGroup>
            <property name="uri.var.stagingUrl" scope="default" type="STRING"
                expression="concat(get-property('env', 'staging_baseUrl'), 'docs/upload')"
                action="set" />
        </propertyGroup>

        <log category="INFO" level="custom">
            <property name="Calling SFDL staging to upload document" value="[CALLING...]" />
        </log>

        <call>
            <endpoint key="stagingPatchService" />
        </call>

        <log category="INFO" level="custom">
            <property name="Http code" expression="$axis2:HTTP_SC" />
            <property name="Response" expression="json-eval($)" />
        </log>

        <log category="INFO" level="custom">
            <property name="[UPLOADING DOCUMENT]" value="[ENDED]" />
        </log>

        <respond />
    </inSequence>

    <faultSequence>
        <sequence key="defaultFaultSequence" />

        <payloadFactory media-type="json">
            <format>{ "returnCode": "$1", "returnMessage": "$2" }</format>
            <args>
                <arg evaluator="xml" expression="get-property('ERROR_CODE')" />
                <arg evaluator="xml" expression="get-property('ERROR_MESSAGE')" />
            </args>
        </payloadFactory>

        <property name="HTTP_SC" expression="get-property('HTTP_SC')" />

        <log category="INFO" level="custom">
            <property name="Http code" expression="$axis2:HTTP_SC" />
            <property name="Response" expression="json-eval($)" />
        </log>

        <log category="INFO" level="custom">
            <property name="[UPLOADING DOCUMENT]" value="[ENDED]" />
        </log>

        <respond />
    </faultSequence>
</resource>

日志:

[2026-03-26 11:14:37,400]  INFO {LogMediator} - {api:SamsungApi} [UPLOADING DOCUMENT] = [ENDED]
[2026-03-26 11:14:37,400] ERROR {JsonUtil} - #writeJsonStream. Could not write JSON stream. MessageID: urn:uuid:65c1e235-6645-4d37-b542-cb3424f96877. Error>> Consumer error or stale connection has occurred.
[2026-03-26 11:14:37,400] ERROR {JsonStreamFormatter} - Error occurred while writing to application/json java.lang.reflect.InvocationTargetException
    at jdk.internal.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:109)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
    at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
    at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
    at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
    at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
    at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.apache.axis2.AxisFault: Could not write JSON stream.
    at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:400)
    at org.apache.synapse.commons.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:77)
    ... 23 more
Caused by: org.apache.axis2.AxisFault: Could not write JSON stream.
    at org.apache.synapse.commons.json.JsonUtil.writeJsonStream(JsonUtil.java:1242)
    at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:388)
    ... 24 more
Caused by: java.io.IOException: Consumer error or stale connection has occurred.
    at org.apache.synapse.transport.passthru.Pipe$ByteBufferOutputStream.write(Pipe.java:665)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1310)
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:978)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1282)
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:953)
    at org.apache.synapse.commons.json.JsonUtil.writeJsonStream(JsonUtil.java:1218)
    ... 25 more

[2026-03-26 11:14:37,403] ERROR {PassThroughHttpSender} - Failed to submit the response org.apache.axis2.AxisFault
    at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:113)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
    at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
    at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
    at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
    at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
    at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)

[2026-03-26 11:14:37,405] ERROR {Axis2Sender} - {api:SamsungApi} Accept:application/json,Accept-Encoding:gzip,Access-Control-Allow-Headers:,Access-Control-Allow-Methods:PATCH,Access-Control-Allow-Origin:,activityid:17b9f8cd-b52e-4872-b6ab-8a5e93c2228d,Authorization:(just header informations), Unexpected error sending message back org.apache.axis2.AxisFault: Failed to submit the response
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.handleException(PassThroughHttpSender.java:691)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:295)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
    at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
    at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
    at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
    at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
    at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
    at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.apache.axis2.AxisFault
    at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:113)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
    ... 17 more

[2026-03-26 11:14:37,517]  INFO {LogMediator} - {api:SamsungApi} To: , MessageID: urn:uuid:65c1e235-6645-4d37-b542-cb3424f96877, correlation_id: 17b9f8cd-b52e-4872-b6ab-8a5e93c2228d, Direction: response, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 050, ERROR_MESSAGE = Your request is not suitable. for more info contact the support., Payload: { "returnCode": "050", "returnMessage": "Your request is not suitable. for more info contact the support." }
[2026-03-26 11:14:37,544]  INFO {LogMediator} - {api:SamsungApi} Http code = 201, Response = {"returnCode":"000","returnMessage":"Success"}
[2026-03-26 11:14:37,544]  INFO {LogMediator} - {api:SamsungApi} [UPLOADING DOCUMENT] = [ENDED]

编辑(31-03-26):请使用此日志 日志文件

这个错误并不常发生。
看起来请求已经发送到后端,但同时出现了一个错误。

WSO2 Micro Integrator版本4.3.0

解决方案

这既不是后端错误,也不是中介层的错误。在WSO2 Micro Integrator中,当无法将响应写回客户端时,会发生这种情况。

你的日志显示后端调用成功(HTTP 201),失败发生在稍后的阶段:

JsonStreamFormatter.writeTo
PassThroughHttpSender.submitResponse

Consumer error or stale connection has occurred

这意味着在MI尝试发送响应时,HTTP连接已经不可用。这可能因为客户端超时、网络中断、较大的载荷(例如base64)导致的慢速流式传输,或在记录日志时使用 json-eval($),从而强制完整消息的构建。

因此,你可以尝试:

  • 移除或避免记录完整载荷(json-eval($)
  • 提高客户端/传输超时
  • 尝试使用更小的载荷

可选地禁用分块传输

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章