Java中的SecureSocial中的自定义视图

Cha*_*ein 5 java playframework securesocial

我看到了一些关于这个话题的问题,但没有人回答我被困在的部分.顺便说一句,基于人们遇到的问题,我可能会建议给出一个模板插件的默认java实现.

我遇到的问题是,我将两个所需的视图从SecureSocial复制到我的views文件夹,并改变了RequestHeader,正如其他人注意到的那样:play.api.mvc.RequestHeader,现在我得到:

ambiguous implicit values: both method requestHeader in object PlayMagicForJava of type => play.api.mvc.RequestHeader and value request of type play.api.mvc.RequestHeader match expected type play.api.mvc.RequestHeader
Run Code Online (Sandbox Code Playgroud)

版本:Play-2.1.1,Java 7,Master的SecureSocial.

编辑:

播放编译:

[error] C:\Java\AwsConsole\app\views\secure\login.scala.html:41: ambiguous impli
cit values:
[error]  both method requestHeader in object PlayMagicForJava of type => play.ap
i.mvc.RequestHeader
[error]  and value request of type play.api.mvc.RequestHeader
[error]  match expected type play.api.mvc.RequestHeader
[error]                         @provider(p.id)
[error]                                  ^
[error] C:\Java\AwsConsole\app\views\secure\provider.scala.html:20: ambiguous im
plicit values:
[error]  both method requestHeader in object PlayMagicForJava of type => play.ap
i.mvc.RequestHeader
[error]  and value request of type play.api.mvc.RequestHeader
[error]  match expected type play.api.mvc.RequestHeader
[error]                 <form action = "@securesocial.core.providers.utils.Route
sHelper.authenticateByPost("userpass").absoluteURL(IdentityProvider.sslEnabled)"

[error]
                                                  ^
[error] two errors found
[error] (compile:compile) Compilation failed
Run Code Online (Sandbox Code Playgroud)

改为在Play Run之后浏览:

Internal server error, for (GET) [/] ->

sbt.PlayExceptions$CompilationException: Compilation error[ambiguous implicit va
lues:
 both method requestHeader in object PlayMagicForJava of type => play.api.mvc.Re
questHeader
 and value request of type play.api.mvc.RequestHeader
 match expected type play.api.mvc.RequestHeader]
        at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun
$apply$16.apply(PlayReloader.scala:349) ~[na:na]
        at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun
$apply$16.apply(PlayReloader.scala:349) ~[na:na]
        at scala.Option.map(Option.scala:133) ~[scala-library.jar:na]
        at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(Pl
ayReloader.scala:349) ~[na:na]
        at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(Pl
ayReloader.scala:346) ~[na:na]
        at scala.Option.map(Option.scala:133) ~[scala-library.jar:na]
Run Code Online (Sandbox Code Playgroud)

Mar*_*zke 8

请求必须明确地传递给登录模板,登录模板必须明确地将请求传递给提供者模板,并且提供者模板必须在调用RoutesHelper.authenticateByPost("userpass").absoluteURL时指定请求.更详细:

  1. java TemplatesPlugin应该有这个getLoginPage实现:

    @Override
    public <A> Html getLoginPage(final play.api.mvc.Request<A> request, final Form<Tuple2<String, String>> form,
            final Option<String> msg) {
        return views.html.login.render(request, form, msg);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 参数(第一行)login.scala.html应如下所示:

    @(request: play.api.mvc.RequestHeader, loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将调用更改login.scala.htmlprovider模板以明确传递请求(我们将在下一步调整其参数).

    1. login.scala.html 第41行,改变

      @provider(p.id)
      
      Run Code Online (Sandbox Code Playgroud)

      @provider(request, p.id)
      
      Run Code Online (Sandbox Code Playgroud)
    2. login.scala.html 第55行,改变

      @provider("userpass", Some(loginForm))
      
      Run Code Online (Sandbox Code Playgroud)

      @provider(request, "userpass", Some(loginForm))
      
      Run Code Online (Sandbox Code Playgroud)
  4. 参数(第一行)provider.scala.html应该将请求作为第一个显式参数:

    @(request: play.api.mvc.RequestHeader, providerId: String, loginForm: Option[play.api.data.Form[(String, String)]] = None)
    
    Run Code Online (Sandbox Code Playgroud)
  5. 提供者模板的第20行需要传递请求(以便调用正确的方法,否则你会得到一个RuntimeException: There is no HTTP Context available from here):

    <form action = "@securesocial.core.providers.utils.RoutesHelper.authenticateByPost("userpass").absoluteURL(IdentityProvider.sslEnabled)(request)"
    
    Run Code Online (Sandbox Code Playgroud)

这应该是所有需要的更改,如果您使用其他模板,则必须相应地进行调整.

只是提到它:我已经将我们的java TemplatesPlugin更改为scala版本(让它更直接).