1


我目前在使用play-pac4j库和Play Framework 2.5时遇到问题。

注释:

@RequiresAuthentication(clientName = "FacebookClient")

在我的控制器方法中导致此堆栈跟踪:

`

java.lang.NoClassDefFoundError: play/libs/F$Function
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getDeclaredConstructors(Class.java:2020)
        at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:245)
        at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:99)
        at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:658)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:882)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:805)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:282)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:214)
Caused by: java.lang.ClassNotFoundException: play.libs.F$Function
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getDeclaredConstructors(Class.java:2020)
        at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:245)
        at

com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:99) 位于 com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:658

)
            at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:882)

`

这是来自我的 build.sbt 的片段,我用于依赖项:

libraryDependencies ++= Seq(
      "org.pac4j" % "play-pac4j" % "2.1.0",
      "org.pac4j" % "pac4j" % "1.8.7",
      "org.pac4j" % "pac4j-http" % "1.8.7",
      "org.pac4j" % "pac4j-cas" % "1.8.7",
      "org.pac4j" % "pac4j-openid" % "1.8.7",
      "org.pac4j" % "pac4j-oauth" % "1.8.7",
      "org.pac4j" % "pac4j-saml" % "1.8.7",
      "org.pac4j" % "pac4j-oidc" % "1.8.7",
      "org.pac4j" % "pac4j-gae" % "1.8.7",
      "org.pac4j" % "pac4j-jwt" % "1.8.7",
      "org.pac4j" % "pac4j-ldap" % "1.8.7",
      "org.pac4j" % "pac4j-sql" % "1.8.7",
      "org.pac4j" % "pac4j-mongo" % "1.8.7",
      "org.pac4j" % "pac4j-stormpath" % "1.8.7")

我的 SecurityModule 类:

public class SecurityModule extends AbstractModule {
protected void configure() {
    FacebookClient facebookClient = new FacebookClient("KEY", "SECRET_KEY");
    Clients clients = new Clients("http://localhost:9000/callback",facebookClient);
    Config config = new Config(clients);
    config.addAuthorizer("admin",new RequireAnyRoleAuthorizer("ROLE_ADMIN"));
    bind(Config.class).toInstance(config);

}

}

包 play.libs.F 在我的项目中可用。 日食截图

我基本上会尝试所有想到的东西。现在我只想在路由配置文件中为我的一个地址启用 facebook 的简单身份验证。我按照此处发布的说明进行操作:https ://github.com/pac4j/play-pac4j 。任何帮助和提示将不胜感激。

4

1 回答 1

2

在这里查看问题页面,pac4j 与 Play 2.5 不兼容。听起来 pac4j 正在使用的 2.5 中缺少一些 API。您在堆栈交易中看到的是 Play 2.5 删除了 scala f.Functionf.Function0classes 等,而不是 Java8java.util.function.*类型。这里有 doco 。

简而言之,要么等待 pac4j 2.3.0 出来,要么回到 Play 2.4。

于 2016-03-30T13:49:32.707 回答