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

如何查看Macwire及Wire宏生成的代码?DefaultSecuredRequestHandler实例创建疑问

查看Macwire生成的代码 & 解决DefaultSecuredRequestHandler的注入问题

一、如何查看Macwire生成的代码

Macwire基于Scala宏实现,有两种简单的方式查看它生成的代码:

  • IDE直观展开:如果你用IntelliJ IDEA,右键点击wire[DefaultSecuredRequestHandler],选择「Expand Macro」,就能直接看到宏展开后的完整代码,这是最方便的方式。
  • 编译时打印宏输出:在sbt项目的build.sbt中添加编译选项,让Scala编译器打印宏展开内容:
    scalacOptions += "-Xmacro-settings:print-macros"
    
    执行编译命令后,控制台会输出所有宏展开的代码,你可以从中找到wire宏生成的部分。如果需要更详细的中间编译步骤,也可以用-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.Default
    
    只要这个实例在wire[DefaultSecuredRequestHandler]的作用域内,Macwire就会自动将它注入到构造函数中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:27