2016-12-15 2 views
1

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 ...

Antwort

1

Die Java-Version von Play hat eine Http.Context über ThreadLocals, während die Scala-Version Anfragen verwendet. Diese können implizit oder explizit sein.

Mit Blick auf Ihre Controller, wenn Sie Deadbolt zu einer Aktion hinzufügen, erhalten Sie eine AuthenticatedRequest. Also, eine nicht-Deadbolt Wirkung von

def foo = Action { request => 
    // request is of type Request 
} 

würde ein request vom Typ Request erhalten, während die gleiche Aktion von Deadbolt geschützt

def foo = actionBuilder.SubjectPresentAction().defaultHandler() { request => 
    // request is of type AuthenticatedRequest 
} 

erhält ein request vom Typ AuthenticatedRequest.

Wenn Sie eine Request zu einem AuthenticatedRequest konvertieren möchten, weil Sie eine Vorlage sind aufrufen, die Deadbolt Zwänge noch enthält der Controller Aktion ist ungezwungen, können Sie WithAuthRequestAction:

def foo = actionBuilder.WithAuthRequestAction().defaultHandler() { request => 
    // request is of type AuthenticatedRequest 
} 

Wenn Sie DeadboltActions sind Injizieren anstelle von ActionBuilders, das gleiche gilt:

def foo= deadboltActions.SubjectPresent()() { request => 
    // request is of type AuthenticatedRequest 
} 

Sie können auch eine Instanz von AuthenticatedRequest aus dem bestehendennur erstellenund ohne Subject unter Verwendung von new AuthenticatedRequest(request, None).

+0

@ (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". –

+0

[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. –

Verwandte Themen