首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play framework 2.4、Guice和securesocial

Play framework 2.4、Guice和securesocial
EN

Stack Overflow用户
提问于 2015-06-02 08:15:44
回答 2查看 1.2K关注 0票数 4

我正在尝试遵循我在http://www.filtercode.com/play/play-scala-securesocial上找到的一个教程。但本教程是针对Play 2.3的。我遇到了一些问题,因为在play版本2.4中,他们从play.api.GlobalSettings中删除了getControllerInstance。如何使用Guice依赖注入来实现所需的相同功能?

代码语言:javascript
复制
    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))
      }

    }

如果我删除上面的Cake Pattern代码片段,则会出现错误消息:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2015-06-22 23:54:12

现在SecureSocial不支持依赖注入(JSR330),在2.4版本中,Play team在消除全局状态方面做了重大改变,使用DI来完成该任务。

关注问题556

更新:正如Jorge指出的那样,从3.0-M4版本开始,Play 2.4被支持。

票数 2
EN

Stack Overflow用户

发布于 2015-11-30 21:45:10

从3.0-M4开始,您可以使用Play 2.4

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30585387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档