我在 Play 中访问请求属性映射的属性时似乎遇到问题。按照 Play ( Link ) 提供的解释,我应该从属性中获取正确的数据,但 Option 返回为 None。
我的结构如下。一个 Controller (后来注入(inject)名为“sec”)具有用于共享访问的类型化属性:
val AuthenticatedAsAttr: TypedKey[AuthenticatedEmail] = TypedKey("AuthenticatedAs")
类型 AuthenticatedEmail 在此 Controller 的伴随对象中定义为案例类:
case class AuthenticatedEmail(email: String)
过滤器将属性传递给下一个请求:
val attrs = requestHeader.attrs + TypedEntry[AuthenticatedEmail](sec.AuthenticatedAsAttr, AuthenticatedEmail(email))
nextFilter(requestHeader.withAttrs(attrs))
当尝试在另一个 Controller 中访问此属性时,返回的选项为 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 href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c8a988bcadbbbce6acad" rel="noreferrer noopener nofollow">[email protected]</a>), ... })
我的Scala版本是2.12.6,Play Framework版本是2.6.18。非常感谢任何帮助。
最佳答案
事实证明,TypedKey 必须位于对象内,而不是可注入(inject) Controller 内。因此,将其移动到如下所示的对象可以解决该问题:
object Attrs {
val AuthenticatedAsAttr: TypedKey[AuthenticatedEmail] = TypedKey("AuthenticatedAs")
}
原因是 TypedKey ( Link ) 的实现,它不包含 equals 方法,因此恢复为比较内存引用。
关于scala - 使用键入的键 Play Framework 请求属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52121605/