我似乎在访问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。我们非常感谢您的帮助。
答案 0 :(得分:0)
事实证明TypedKey必须在对象之内,而不是可注入的控制器。因此,将其移动到如下所示的对象可以解决此问题:
object Attrs {
val AuthenticatedAsAttr: TypedKey[AuthenticatedEmail] = TypedKey("AuthenticatedAs")
}
原因是TypedKey(Link)的实现,它不包含equals方法,因此将还原为比较内存引用。