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

Scala Play 2.4遇ProvisionException:无法找到FileCtrl合适构造函数

解决Play 2.4中Controller注入的构造函数异常问题

我一眼就看出问题所在了——你虽然给FileCtrl的构造函数加了@Inject注解,但参数列表的写法不符合Play 2.4 + Guice的注入规则!

问题根源

你现在的构造函数用了双重参数列表:

class FileCtrl @Inject()(...) (val messagesApi: MessagesApi) extends ...

@Inject只标注了第一个参数列表,第二个参数列表里的messagesApi并没有被纳入注入范围。Guice会认为这个构造函数需要手动传入messagesApi,但Play框架在创建Controller实例时是完全依赖注入的,不会手动传参,所以它就报错说找不到“合适的构造函数”——要么是带@Inject的单构造函数,要么是无参构造函数。

修复方案

把所有需要注入的参数(包括messagesApi)合并到同一个被@Inject标注的参数列表里就行:

class FileCtrl @Inject()(
  actions: Actions,
  helpers: Helpers,
  errorHandler: ErrorHandler,
  cacheApi: CacheApi,
  fileDAO: FileDAO,
  companyFileService: CompanyFileService,
  imageService: ImageService,
  configuration: Configuration,
  settingService: SettingService,
  fileService: FileService,
  val messagesApi: MessagesApi  // 移到第一个参数列表中
) extends Controller with I18nSupport with Flow {
  // 你的业务逻辑代码
}

额外说明

  • Play 2.4的Guice注入要求:所有需要依赖注入的参数必须放在同一个被@Inject注解标注的参数列表中,拆分参数列表会导致Guice无法识别完整的注入需求。
  • 从你的堆栈跟踪来看,Guice并没有抱怨找不到某个依赖类(比如Actions或FileDAO),说明这些类的绑定都是正常的,核心问题就是参数列表的写法。

修改完代码后,重新编译启动应用,这个ProvisionException应该就会消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:14