我看到了关于这个话题的一些问题,但没有人回答我被困在的部分。顺便说一句,基于人们遇到的问题,我可能会建议给出一个模板插件的默认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]
答案 0 :(得分:8)
请求必须明确地传递给登录模板,登录模板必须明确地将请求传递给提供者模板,并且提供者模板必须在调用RoutesHelper.authenticateByPost(“userpass”)。absoluteURL时指定请求。更详细:
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);
}
login.scala.html
的参数(第一行)应如下所示:
@(request: play.api.mvc.RequestHeader, loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None)
将来自login.scala.html
的来电更改为provider
模板以明确传递请求(我们将在下一步调整其参数)。
login.scala.html
第41行,更改
@provider(p.id)
到
@provider(request, p.id)
login.scala.html
第55行,更改
@provider("userpass", Some(loginForm))
到
@provider(request, "userpass", Some(loginForm))
provider.scala.html
的参数(第一行)应将请求作为第一个显式参数:
@(request: play.api.mvc.RequestHeader, providerId: String, loginForm: Option[play.api.data.Form[(String, String)]] = None)
提供者模板的第20行需要传递请求(以便调用正确的方法,否则您将获得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版本(让它更直接)。