Scala 第2.5节门闩-2';s@subjectPresentOr从Java迁移->;斯卡拉

Scala 第2.5节门闩-2';s@subjectPresentOr从Java迁移->;斯卡拉,scala,playframework,deadbolt-2,Scala,Playframework,Deadbolt 2,我正在将现有的Java Play 2.5应用程序迁移到Scala,并在视图main.Scala.html中找到以下类的用法: 我有一些直觉为什么。。。有时,例如,当用户尚未登录时,没有类型为deadbolt-2的AuthenticatedRequest[\u]的请求,而是超类类型play.api.mvc.RequestHeader,它不能正确地隐式地与其子类AuthenticatedRequest[\u]匹配 问题是为什么它首先在Java版本中工作?的Java版本不需要任何隐式请求:) 为了在S

我正在将现有的Java Play 2.5应用程序迁移到Scala,并在视图
main.Scala.html
中找到以下类的用法:

我有一些直觉为什么。。。有时,例如,当用户尚未登录时,没有类型为deadbolt-2的
AuthenticatedRequest[\u]
的请求,而是超类类型
play.api.mvc.RequestHeader
,它不能正确地隐式地与其子类
AuthenticatedRequest[\u]
匹配

问题是为什么它首先在Java版本中工作?的Java版本不需要任何隐式请求:)


为了在Scala版本中修复它,我将使用模式匹配来包装
@subjectPresentOr
块,以发现隐式请求的动态类型,并且只有当其动态类型为
AuthenticatedRequest[\u]
时,我才会显示该块并将该类型的缩小请求显式传递给
@subjectPresentOr
。虽然这不是非常优雅,但我想不出任何其他方式…

Java版本的Play通过ThreadLocals提供了一个
Http.Context
,而Scala版本使用请求。这些可能是隐式的,也可能是显式的

查看控制器,当您将死锁添加到操作时,您将收到一个
认证请求
。所以,一个非锁紧作用

def foo = Action { request =>
  // request is of type Request
}
将接收类型为
请求
请求
,而相同的操作受死锁保护

def foo = actionBuilder.SubjectPresentAction().defaultHandler() { request =>
  // request is of type AuthenticatedRequest
}
接收类型为
AuthenticatedRequest
请求

如果您要将
请求
转换为
AuthenticatedRequest
,因为您调用的模板包含死锁约束,但控制器操作不受约束,则可以使用
with AuthRequestAction

def foo = actionBuilder.WithAuthRequestAction().defaultHandler() { request =>
  // request is of type AuthenticatedRequest
}
如果您正在注入
DeadboltActions
以代替
ActionBuilders
,则同样适用:

def foo= deadboltActions.SubjectPresent()() { request =>
  // request is of type AuthenticatedRequest
}
您还可以使用
新的AuthenticatedRequest(Request,None)

@(Steve Chalonder)从现有的
请求创建一个
AuthenticatedRequest
的实例,并且没有
主题。我认为在每个返回
RequestHeader
的操作中,使用
actionBuilder.WithAuthRequestAction().defaultHandler()
可以解决这个问题。顺便问一下,这是一个较短的版本:
actionBuilder.WithAuthRequestAction()()
?再次感谢您的帮助和Deadbolt-2非常干净的代码,Play应该从中学习,例如,关于将Java与Scala分离的干净设计,而不是它们令人困惑的
Play.x
vs
Play.api.x
。为so
actionBuilder提供替代语法。WithAuthRequestAction()()
无效。有关更多详细信息,请参阅和。
def foo = actionBuilder.WithAuthRequestAction().defaultHandler() { request =>
  // request is of type AuthenticatedRequest
}
def foo= deadboltActions.SubjectPresent()() { request =>
  // request is of type AuthenticatedRequest
}