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

