搭建Play+gRPC测试项目,配置完成后未生成AkkaGrpcClientModule,求排查
Play + gRPC 缺失
AkkaGrpcClientModule 的配置修复 问题本质
现在的配置只开了服务端方向的Play gRPC代码生成,压根没加载客户端侧的Play适配生成器,自然不会产出那个用来做Guice绑定的AkkaGrpcClientModule类。
你列出来的已生成产物可以直接对应上当前的生成逻辑:
- 服务端绑定类:
AbstractGreeterRouter、GreeterHandler$ - Akka原生生成的客户端类:
DefaultGreeterClient、GreeterClient、GreeterClientPowerApi - protobuf序列化消息类:
Greeter、HelloProto$、HelloReply、HelloRequest
这些都是基础生成逻辑跑出来的东西,缺的就是适配Play依赖注入体系的客户端绑定模块。
要补的配置
build.sbt 调整
原来只引入了服务端生成器PlayScalaServerCodeGenerator,必须把客户端的Play适配生成器也加进去,配置改成这样:
enablePlugins(AkkaGrpcPlugin) // 原有服务端生成器导入保留 import play.grpc.gen.scaladsl.PlayScalaServerCodeGenerator // 缺的客户端适配生成器导入 import play.grpc.gen.scaladsl.PlayScalaClientCodeGenerator // 同时加载两端的Play代码生成器 akkaGrpcExtraGenerators += PlayScalaServerCodeGenerator akkaGrpcExtraGenerators += PlayScalaClientCodeGenerator libraryDependencies ++= Seq( "com.lightbend.play" %% "play-grpc-runtime" % "0.9.1" )
注意:你plugins.sbt里的现有配置是没问题的,play-grpc-generators这个插件依赖已经同时打包了服务端、客户端的代码生成器类,不需要额外加插件引用,只要在build.sbt里显式把客户端生成器加到配置列表即可。
那个PlayScalaClientCodeGenerator的作用,就是扫你写的proto服务定义,自动生成包含AkkaGrpcClientModule的绑定类,把原生的Akka gRPC客户端实例注册到Play的Guice容器里,让你可以直接在Controller、Service里注入使用。
如果要更稳妥,可以加个开关明确指定要生成客户端+服务端代码,避免默认配置偏差:
akkaGrpcGeneratedTypes := Seq(AkkaGrpc.Server, AkkaGrpc.Client)
几个容易踩的坑
- 改完配置一定要跑一次
sbt clean,清掉之前的旧生成产物再重新编译,增量编译不会主动触发之前缺的代码生成流程 - 之前配置里加的Bintray仓库已经停服了,要是拉依赖报错可以把那行resolver删掉,0.9.1版本的play-grpc依赖已经在Maven中央仓库同步了,不用额外配第三方仓库就能拉到
- 别搞混两个生成器的作用:
PlayScalaServerCodeGenerator只处理服务端的路由绑定,半行客户端相关的代码都不会生成,不要指望开了它能出客户端的绑定模块
内容的提问来源于stack exchange,提问作者Normal
相关产品推荐
相关产品推荐

