You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Postman在WSO2微集成器中发起gRPC请求?遇空指针异常

WSO2微集成器gRPC入站端点空指针异常排查与解决

问题场景

  • 配置gRPC入站端点:
    创建grpcInboundEndpoint.xml并放置到<MI_Home>/repository/deployment/server/synapse-configs/default/inbound-endpoints目录,启动WSO2 MI:
    <?xml version="1.0" encoding="UTF-8"?>
    <inboundEndpoint xmlns="http://ws.apache.org/ns/synapse" name="GrpcInboundEndpoint" sequence="inSeq" onError="fault" protocol="grpc" suspend="false">
        <parameters>
            <parameter name="inbound.grpc.port">8888</parameter>
        </parameters>
    </inboundEndpoint>
    
  • 通过Postman发起gRPC请求:
    调用EventService.process方法,使用的请求消息:
    {
        "headers": {},
        "payload": "test"
    }
    
  • 异常表现:
    控制台抛出空指针异常,gRPC返回状态码2 UNKNOWN,异常栈信息:
    [2024-03-29 14:15:48,233] ERROR {io.grpc.internal.SerializingExecutor} -  - Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@547800d3 java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
        at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1535)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectInbound(Axis2SynapseEnvironment.java:423)
        at org.wso2.carbon.inbound.endpoint.protocol.grpc.GRPCInjectHandler.initiateSequenceAndInjectPayload(GRPCInjectHandler.java:138)
        at org.wso2.carbon.inbound.endpoint.protocol.grpc.GRPCInjectHandler.invokeProcess(GRPCInjectHandler.java:84)
        at org.wso2.carbon.inbound.endpoint.protocol.grpc.InboundGRPCListener$1.process(InboundGRPCListener.java:84)
        at org.wso2.carbon.inbound.endpoint.protocol.grpc.util.EventServiceGrpc$MethodHandlers.invoke(EventServiceGrpc.java:290)
        at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:182)
        at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:351)
        at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:861)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
        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:750)
    

排查与解决方法

1. 确保关联的序列存在

入站端点配置中指定了sequence="inSeq",但如果该序列未创建,会导致消息注入时触发空指针:

  • 解决:在<MI_Home>/repository/deployment/server/synapse-configs/default/sequences目录创建inSeq.xml,示例:
    <?xml version="1.0" encoding="UTF-8"?>
    <sequence xmlns="http://ws.apache.org/ns/synapse" name="inSeq">
        <log level="full"/>
        <respond/>
    </sequence>
    
    创建后重启WSO2 MI或等待热部署生效。

2. 修正gRPC请求消息格式

WSO2 MI的gRPC入站端点依赖Protobuf定义生成的Stub类,请求消息必须与Protobuf定义的结构严格匹配:

  • 你发送的消息包含外层headers和payload嵌套,但根据对应Protobuf定义,process方法的请求类型为EventRequest,仅包含payload字段,因此正确的请求消息应为:
    {
        "payload": "test"
    }
    
    或直接传入字符串值(根据Protobuf JSON映射规则):
    "test"
    

3. 升级WSO2 MI版本

部分旧版本的WSO2 MI存在gRPC入站端点的空指针bug,建议升级到4.2.0及以上的稳定版本,修复已知问题。

4. 校验依赖完整性

确认WSO2 MI的<MI_Home>/lib目录下包含所有gRPC相关依赖jar包,若缺失依赖会导致消息处理时出现异常。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:55:25