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

WireMock gRPC Demo无响应问题排查求助

问题:Spring Boot集成WireMock gRPC Demo调用返回内部错误

我尝试基于Spring Boot运行WireMock官方gRPC文档中的Demo,配置了如下Bean:

@Configuration
public class WiremockConfiguration {

@Bean
public WireMockServer grpcWireMockServer() {
    var server = startGrpcWiremockServer();

    return server;
}

@Bean
public WireMockGrpcService marginReportHistoryServiceGrpc(@Qualifier("grpcWireMockServer") WireMockServer grpcWireMockServer) {
    var mockService = new WireMockGrpcService(new WireMock(grpcWireMockServer.port()), "com.example.grpc.GreetingService");

    System.out.println("Port: " + grpcWireMockServer.port());

    mockService.stubFor(
            method("/greeting")
                    .withRequestMessage(equalToJson("{ \"name\":  \"Tom\" }"))
                    .willReturn(json("{ \"greeting\": \"Hi Tom from JSON\" }"))
    );

    return mockService;
}

public WireMockServer startGrpcWiremockServer() {
    var server = new WireMockServer(wireMockConfig()
            .dynamicPort()
            .withRootDirectory("src/main/resources/wiremock")
            .extensions(new GrpcExtensionFactory())
    );

    server.start();

    return server;
}
}

完整代码可查看GitHub仓库gasparuhov-dev/wiremock-grpc

服务启动后端口已打印,但通过Postman调用WireMock时返回内部错误,请问我遗漏了什么配置或步骤?


排查与解决步骤

1. 修正gRPC方法路径格式

gRPC的标准方法路径格式为/包名.服务名/方法名,你当前使用的/greeting缺少完整的服务前缀,导致WireMock无法匹配到对应的stub。需要修改为/com.example.grpc.GreetingService/greeting。

2. 正确关联WireMock实例

你通过new WireMock(grpcWireMockServer.port())创建的WireMock实例没有关联到已启动服务器的gRPC扩展上下文,应该直接使用服务器内置的WireMock实例:

var wireMock = grpcWireMockServer.getWireMock();
var mockService = new WireMockGrpcService(wireMock, "com.example.grpc.GreetingService");

3. 验证Protobuf与JSON结构匹配

确保你的Protobuf定义中GreetingRequest和GreetingResponse的字段与JSON完全匹配:

  • 字段名(大小写、驼峰/下划线)一致
  • 字段类型匹配(比如name必须是string类型)
  • 符合Protobuf JSON映射规则(如enum值用字符串而非数字)

4. 检查依赖版本兼容性

确保wiremock-grpc-extension的版本与WireMock核心版本完全一致,版本不匹配会导致扩展加载异常。

修改后的核心Bean代码

@Bean
public WireMockGrpcService marginReportHistoryServiceGrpc(@Qualifier("grpcWireMockServer") WireMockServer grpcWireMockServer) {
    var wireMock = grpcWireMockServer.getWireMock();
    var mockService = new WireMockGrpcService(wireMock, "com.example.grpc.GreetingService");

    System.out.println("Port: " + grpcWireMockServer.port());

    mockService.stubFor(
            method("/com.example.grpc.GreetingService/greeting")
                    .withRequestMessage(equalToJson("{ \"name\":  \"Tom\" }"))
                    .willReturn(json("{ \"greeting\": \"Hi Tom from JSON\" }"))
    );

    return mockService;
}

额外检查点

  • 确认src/main/resources/wiremock目录存在且权限正常(动态stub场景下该目录可无内容,但需避免目录不存在导致的初始化错误)
  • Postman调用时需选择gRPC协议,正确填写服务名com.example.grpc.GreetingService和方法名greeting,请求JSON严格匹配Protobuf结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:52:39