【问题标题】:Play Framework request attributes with typed key使用键入的键播放框架请求属性
【发布时间】:2018-09-03 17:23:13
【问题描述】:

我似乎在访问 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))

当试图在另一个控制器中访问该属性时,返回的选项是无:

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 Framework 版本是 2.6.18。非常感谢任何帮助。

【问题讨论】:

  • Controller中的println是否要使用AuthenticatedAsAttr? (也检查requestHeader.addAttr > 简化你的代码)
  • @pme println 位于控制器中,我想在其中访问属性但获取无。所以我通过 println 看到 AuthenticatedAs -> .. 的映射在 attrs 中,但没有得到值。

标签: scala playframework


【解决方案1】:

事实证明,TypedKey 必须在 object 内,而不是可注入控制器。因此,将其移至如下对象即可解决问题:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2022-09-26
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多