如何查看Macwire及Wire宏生成的代码?DefaultSecuredRequestHandler实例创建疑问
查看Macwire生成的代码 & 解决DefaultSecuredRequestHandler的注入问题
一、如何查看Macwire生成的代码
Macwire基于Scala宏实现,有两种简单的方式查看它生成的代码:
- IDE直观展开:如果你用IntelliJ IDEA,右键点击
wire[DefaultSecuredRequestHandler],选择「Expand Macro」,就能直接看到宏展开后的完整代码,这是最方便的方式。 - 编译时打印宏输出:在sbt项目的
build.sbt中添加编译选项,让Scala编译器打印宏展开内容:
执行编译命令后,控制台会输出所有宏展开的代码,你可以从中找到wire宏生成的部分。如果需要更详细的中间编译步骤,也可以用scalacOptions += "-Xmacro-settings:print-macros"-Xprint:typer,不过输出内容会更多,需要自行过滤。
二、解析wire[DefaultSecuredRequestHandler]的生成代码 & BodyParser.Default的来源
首先,DefaultSecuredRequestHandler的构造函数需要依赖BodyParser[AnyContent](也就是你提到的BodyParser.Default)以及Silhouette的其他核心组件(比如环境、授权策略等)。Macwire的wire宏会自动在当前作用域中查找匹配类型的实例,然后生成构造代码。
1. 生成的代码示例
当你的作用域中存在BodyParser.Default和其他必要依赖时,宏展开后的代码大概长这样:
lazy val securedRequestHandler: SecuredRequestHandler = new DefaultSecuredRequestHandler( bodyParser, // 这里就是找到的BodyParser.Default实例 silhouetteEnvironment, // 自动注入的Silhouette环境实例 authorizationStrategy // 自动注入的授权策略实例 )
2. 获取BodyParser.Default的方法
BodyParser.Default是Play Framework提供的默认请求体解析器(因为Silhouette通常和Play配合使用),你可以通过以下方式在作用域中提供它:
- 在Play Controller中:直接导入Play的BodyParsers,或者通过依赖注入获取:
import play.api.mvc.{BodyParsers, Controller} import javax.inject.Inject class MyController @Inject()(val bodyParser: BodyParsers.Default) extends Controller { // 这里的bodyParser就是你需要的实例 } - 在独立组件/模块中:直接导入并实例化,或者通过依赖注入绑定:
只要这个实例在import play.api.mvc.BodyParsers // 直接创建实例,让Macwire能找到它 lazy val bodyParser: BodyParsers.Default = BodyParsers.Defaultwire[DefaultSecuredRequestHandler]的作用域内,Macwire就会自动将它注入到构造函数中。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

