Scala Play framework 2.4、Guice和securesocial
我正在尝试遵循我在网站上找到的教程 . 但本教程是针对第2.3集的。我遇到问题,因为在play 2.4版中,他们从play.api.GlobalSettings中删除了getControllerInstance。如何使用Guice依赖项注入来实现所需的相同功能Scala Play framework 2.4、Guice和securesocial,scala,playframework,dependency-injection,securesocial,Scala,Playframework,Dependency Injection,Securesocial,我正在尝试遵循我在网站上找到的教程 . 但本教程是针对第2.3集的。我遇到问题,因为在play 2.4版中,他们从play.api.GlobalSettings中删除了getControllerInstance。如何使用Guice依赖项注入来实现所需的相同功能 import java.lang.reflect.Constructor import securesocial.core.RuntimeEnvironment import securesocial.core.p
import java.lang.reflect.Constructor
import securesocial.core.RuntimeEnvironment
import securesocial.core.providers._
import securesocial.core.providers.utils.{Mailer, PasswordHasher, PasswordValidator}
import services.{DemoUserService}
import models.DemoUser
import scala.collection.immutable.ListMap
object Global extends play.api.GlobalSettings {
/**
* Demo application's custom Runtime Environment
*/
object DemoRuntimeEnvironment extends RuntimeEnvironment.Default[DemoUser] {
override lazy val userService: DemoUserService = new DemoUserService
override lazy val providers = ListMap(
include(new FacebookProvider(routes, cacheService, oauth2ClientFor(FacebookProvider.Facebook))),
include(new GitHubProvider(routes, cacheService, oauth2ClientFor(GitHubProvider.GitHub))),
include(new GoogleProvider(routes, cacheService, oauth2ClientFor(GoogleProvider.Google))),
include(new LinkedInProvider(routes, cacheService, oauth1ClientFor(LinkedInProvider.LinkedIn))),
include(new TwitterProvider(routes, cacheService, oauth1ClientFor(TwitterProvider.Twitter))),
include(new UsernamePasswordProvider[DemoUser](userService, avatarService, viewTemplates, passwordHashers))
)
}
/**
* Dependency injection on Controllers using Cake Pattern
*
* @param controllerClass
* @tparam A
* @return
*/
override def getControllerInstance[A](controllerClass: Class[A]): A = {
val instance = controllerClass.getConstructors.find { c =>
val params = c.getParameterTypes
params.length == 1 && params(0) == classOf[RuntimeEnvironment[DemoUser]]
}.map {
_.asInstanceOf[Constructor[A]].newInstance(DemoRuntimeEnvironment)
}
instance.getOrElse(super.getControllerInstance(controllerClass))
}
}
删除上面的蛋糕图案片段时出现错误消息:
ProvisionException: Unable to provision, see the following errors:
1) Could not find a suitable constructor in controllers.Application. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. at controllers.Application.class(Application.scala:27) while locating com.google.inject.Provider<controllers.Application> for parameter 1 at router.Routes.<init>(Routes.scala:47) while locating router.Routes while locating play.api.inject.RoutesProvider while locating play.api.routing.Router
2) Could not find a suitable constructor in securesocial.controllers.LoginPage. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. at securesocial.controllers.LoginPage.class(LoginPage.scala:32) while locating com.google.inject.Provider<securesocial.controllers.LoginPage> for parameter 3 at router.Routes.<init>(Routes.scala:47) while locating router.Routes while locating play.api.inject.RoutesProvider while locating play.api.routing.Router
3) Could not find a suitable constructor in securesocial.controllers.PasswordChange. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. at securesocial.controllers.PasswordChange.class(PasswordChange.scala:34) while locating com.google.inject.Provider<securesocial.controllers.PasswordChange> for parameter 5 at router.Routes.<init>(Routes.scala:47) while locating router.Routes while locating play.api.inject.RoutesProvider while locating play.api.routing.Router
4) Could not find a suitable constructor in securesocial.controllers.ProviderController. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. at securesocial.controllers.ProviderController.class(ProviderController.scala:33) while locating com.google.inject.Provider<securesocial.controllers.ProviderController> for parameter 6 at router.Routes.<init>(Routes.scala:47) while locating router.Routes while locating play.api.inject.RoutesProvider while locating play.api.routing.Router
5) Could not find a suitable constructor in securesocial.controllers.Registration. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. at securesocial.controllers.Registration.class(Registration.scala:37) while locating com.google.inject.Provider<securesocial.controllers.Registration> for parameter 4 at router.Routes.<init>(Routes.scala:47) while locating router.Routes while locating play.api.inject.RoutesProvider while locating play.api.routing.Router
5 errors
ProvisionException:无法设置,请查看以下错误:
1) 在controllers.Application中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。在controllers.Application.class(Application.scala:27)中查找router.Routes处参数1的com.google.inject.Provider时。(Routes.scala:47)在查找router.Routes时查找play.api.inject.routed时提供程序在查找play.api.routing.router时提供
2) 在securesocial.controllers.LoginPage中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。在securesocial.controllers.LoginPage.class(LoginPage.scala:32)上查找参数3的com.google.inject.Provider(Routes.scala:47),在查找router.Routes时查找play.api.inject.routed时查找play.api.routed.routed时查找Provider
3) 在securesocial.controllers.PasswordChange中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。在securesocial.controllers.PasswordChange.class(PasswordChange.scala:34)中查找com.google.inject.Provider,参数5位于router.Routes。(Routes.scala:47)时查找router.Routes,同时查找play.api.inject.RoutesProvider,同时查找play.api.routing.router
4) 在securesocial.controllers.ProviderController中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。在securesocial.controllers.ProviderController.class(ProviderController.scala:33)中查找参数6的com.google.inject.Provider时,在router.Routes.(Routes.scala:47)中查找router.Routes时,在play.api.inject.RoutesProvider中查找play.api.routing.router
5) 在securesocial.controllers.Registration中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。在securesocial.controllers.Registration.class(Registration.scala:37)中查找router.Routes处参数4的com.google.inject.Provider。(Routes.scala:47)在查找router.Routes时查找play.api.inject.RoutesProvider时查找play.api.routing.router
5个错误
目前SecureSocial不支持依赖注入(JSR330),在2.4版上,游戏团队对消除全局状态做了重大更改,使用DI完成该任务
关注这个问题
更新:正如Jorge自3.0-M4版本以来所指出的,支持播放2.4。从3.0-M4开始,您可以使用播放2.4