5

我看到了一些关于这个话题的问题,但没有人回答我坚持的部分。顺便说一句,根据人们遇到的问题,我可能建议毕竟给 TemplatesPlugin 提供一个默认的 java 实现。

我遇到的问题是,我将两个需要的视图从 SecureSocial 复制到了我的视图文件夹,并更改了 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 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]
4

1 回答 1

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.htmlprovider模板的调用以显式传递请求(我们将在下一步中调整其参数)。

    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 行需要传递请求(这样才能调用正确的方法,否则会得到 a RuntimeException: There is no HTTP Context available from here):

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

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

顺便提一下:我已将我们的 java TemplatesPlugin 更改为 scala 版本(使其更直接)。

于 2013-05-01T21:47:18.930 回答