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
相关产品推荐
相关产品推荐

