【问题标题】:Addition of an attribute to a Play request makes a new instance of request?向 Play 请求添加属性会生成一个新的请求实例?
【发布时间】:2018-04-09 22:39:29
【问题描述】:

如果您像我一样来自 Java Servlet 世界,那么 Play 对请求属性的支持(最近在 2.6 版中引入)的时间太长了。现在,我有机会详细了解它,我想知道它是否可用。

文档中的逐字记录 (Scala):

// Create a TypedKey to store a User object
object Attrs {
  val User: TypedKey[User] = TypedKey.apply[User]("user")
}
// Get the User object from the request
val user: User = req.attrs(Attrs.User)
// Put a User object into the request
val newReq = req.addAttr(Attrs.User, newUser)

我理解并欣赏不可变对象的功能思想,但如果这个 sn-p 被解释为向请求添加属性的行为让我持有一个新请求,那我该怎么办! ?在回调的反应式世界中,Play 将请求传递给 my 代码的想法不就是相反吗?如果我不能在动作中附加一个属性,然后在错误处理程序中检查它,这有什么好处?希望我只是在这里遗漏了一些东西......

【问题讨论】:

    标签: scala playframework playframework-2.6


    【解决方案1】:

    您通过过滤器将属性附加到请求。 https://www.playframework.com/documentation/2.6.x/ScalaHttpFilters

    过滤器然后可以将 new 请求传递给框架,然后框架会将其提供给您的处理程序。

    编辑:

    将修改后的(新)请求传回框架:

    ...
    nextFilter(requestHeader.addAttr(Attrs.User, newUser))
    ...
    

    【讨论】:

    • 谢谢,@Alvaro。恐怕,您的回答对我来说似乎不合适。这一次,在您引用的文档中没有将请求对象交还给框架的示例。但即便如此,您的回答仍然没有实际意义,因为我需要在操作中附加属性。也许,这不是 Play 开发人员打算涵盖的用例,尽管它是 servlet 编程中非常常见的技术。
    • 函数式方法肯定与 java servlet 世界非常不同(阅读:更好)。如果你提供一个更具体的例子来说明你想要实现的目标,我可能会提供帮助。
    • 好吧,作为编写 Lisp 解析器的人,我挖掘了它的优点。但我也不相信函数式方法在所有情况下都更好。至于用例:简单。我想要一个动作的继承层次结构,这最终在 2.6 中是可能的,因为动作现在是类。我需要在行动中保持很多状态,无论现在在纯粹主义者看来是错误的。最安全的方法是将其附加到请求中,而不是在操作本身中管理它。
    • 这可能是 XY 问题。它当然有可能无法以您期望的方式实现。不能肯定地说没有更具体的问题。特别是:“动作的继承层次结构”听起来更像是对问题的预期解决方案,而不是问题本身。
    • 我只是在回应“阅读:更好”的声明。我很高兴更详细地描述手头的实际问题,但它需要的字符比评论所允许的要多。请建议正确的格式。
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多