使用键入的键播放Framework请求属性

时间:2018-08-31 19:24:18

标签: scala playframework

我似乎在访问Play中的请求属性映射的属性时遇到问题。按照Play(Link)的解释,我应该从属性中获取正确的数据,但是Option返回为None。

我的结构如下。一个控制器(后来注入的名称为“ sec”)具有用于共享访问它的typed属性:

val AuthenticatedAsAttr: TypedKey[AuthenticatedEmail] = TypedKey("AuthenticatedAs")

AuthenticatedEmail类型在此控制器的伴随对象中定义为案例类:

case class AuthenticatedEmail(email: String)

过滤器将属性传递给下一个请求:

val attrs = requestHeader.attrs + TypedEntry[AuthenticatedEmail](sec.AuthenticatedAsAttr, AuthenticatedEmail(email))
nextFilter(requestHeader.withAttrs(attrs))

当尝试在另一个控制器中访问此属性时,返回的Option为None:

val auth = request.attrs.get(sec.AuthenticatedAsAttr)

我通过println确认该值肯定在request.attrs中,但用尽了所有选项来成功调试问题。下面的println输出的一部分。

(Request attrs,{HandlerDef -> HandlerDef(sun.misc .... ,POST, ... Cookies -> Container<Cookies(Cookie ... , AuthenticatedAs -> AuthenticatedEmail(a@test.de), ... })

我的Scala版本为2.12.6,Play框架版本为2.6.18。我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

事实证明TypedKey必须在对象之内,而不是可注入的控制器。因此,将其移动到如下所示的对象可以解决此问题:

object Attrs {
    val AuthenticatedAsAttr: TypedKey[AuthenticatedEmail] = TypedKey("AuthenticatedAs")
}

原因是TypedKey(Link)的实现,它不包含equals方法,因此将还原为比较内存引用。