scala - 使用键入的键 Play Framework 请求属性

标签 scala playframework

我在 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/

相关文章:

scala - Scala 中的 trait 是否消除了通过依赖注入(inject)添加行为的需要?

java - Slick 3 java.time.LocalDate 映射

scala - 从 App 扩展和对象之间的区别包含 Scala 中的主要方法

java - 发生 OutOfMemoryError : Java heap space in play framework

Scala私有(private)函数

scala - 从另一个案例类扩展案例类

playframework - 基于 "resource"连接的客户端正在处理的 BroadcastHub 过滤?

Java + Play Framework 2 在同一类中具有嵌套 Action 组合

java - 如何检查jpa中一对多关系模型字段值的条件

json - 在 Play Framework Scala 中列出 Json