Java中的SecureSocial中的自定义视图

时间:2013-04-29 17:04:48

标签: 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

版本: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

改为播放Play后浏览:

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]

1 个答案:

答案 0 :(得分: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);
    }
    
  2. login.scala.html的参数(第一行)应如下所示:

    @(request: play.api.mvc.RequestHeader, loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None)
    
  3. 将来自login.scala.html的来电更改为provider模板以明确传递请求(我们将在下一步调整其参数)。

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

      @provider(p.id)
      

      @provider(request, p.id)
      
    2. login.scala.html第55行,更改

      @provider("userpass", Some(loginForm))
      

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

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

    <form action = "@securesocial.core.providers.utils.RoutesHelper.authenticateByPost("userpass").absoluteURL(IdentityProvider.sslEnabled)(request)"
    
  6. 这应该是所有需要的更改,如果您使用其他模板,则必须相应地进行调整。

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