Ich Migration eine vorhandene Java 2.5-Anwendung Scala spielen und in der Ansicht main.scala.html
die Verwendung der folgenden deadbolt-2 Klasse subjectPresentOr
gefunden:Wiedergabe 2.5 Deadbolt-2 des @subjectPresentOr von Java Migration -> Scala
@subjectPresentOr() {
<ul class="nav navbar-nav navbar-right">
@defining(userProvider.getUser(session())) { user =>
... user is present html
}
} {
... user is NOT present html
}
nachdem alle Controller und Aktionen zu Scala Migration (und die Änderung der deadbolt-2 Abhängigkeit von Java -> Scala) erhalte ich die folgende Compiler-Fehler aufgrund der Tatsache, dass subjectPresentOr
eine implizite Anforderung des Typs erfordert AuthenticatedRequest[Any]
:
main.scala.html:49: could not find implicit value for parameter request:
be.objectify.deadbolt.scala.AuthenticatedRequest[Any]
und ich habe eine Intuition, warum ... einige Male, z. Wenn der Benutzer noch nicht angemeldet ist, gibt es keine Anfrage vom Typ AuthenticatedRequest[_]
des Typs deadbolt-2, aber der Superklassen-Typ play.api.mvc.RequestHeader
und es kann nicht zu Recht mit seiner Unterklasse AuthenticatedRequest[_]
implizit übereinstimmen.
Die Frage ist, warum dies in der Java-Version überhaupt funktioniert? Die Java-Version von @subjectPresentOr
keine implizite Anfrage benötigt :)
Um es in der Scala-Version zu beheben würde ich den @subjectPresentOr
Block mit Pattern-Matching-wickelt den dynamischen Typen der impliziten Anforderung zu entdecken und nur, wenn der dynamischen Typen ist AuthenticatedRequest[_]
Ich werde dann den Block zeigen und @subjectPresentOr
explizit die eingeengte Anfrage dieses Typs übergeben. Dies ist nicht super elegant, aber ich kann nicht anders ...
@ (Steve Chalonder) Danke, ja, es macht alles Sinn. Ich denke, dass das Problem mit 'actionBuilder.WithAuthRequestAction(). DefaultHandler()' in jeder Aktion gelöst wird, die 'RequestHeader' zurückgibt. BTW ist dies eine kürzere Version: 'actionBuilder.WithAuthRequestAction()()'? Nochmals vielen Dank für die Hilfe und für den sehr sauberen Code von Deadbolt-2, sollte Play daraus lernen, z.B.in Bezug auf das saubere Design, das Java von Scala trennt, anstatt deren verwirrendes "play.x" gegen "play.api.x". –
[ActionBuilders] (https://github.com/schaloner/deadbolt-2-scala/blob/master/code/app/be/objectify/deadbolt/scala/ActionBuilders.scala) bietet eine alternative Syntax für [DeadboltActions] (https://github.com/schaloner/deadbolt-2-scala/blob/master/code/app/be/objectify/deadbolt/scala/DeadboltActions.scala) also ist 'actionBuilder.WithAuthRequestAction()()' nicht gültig . Weitere Informationen finden Sie unter https://deadbolt-scala.readme.io/docs/action-builders und https://deadbolt-scala.readme.io/docs/action-composition. –