微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Constraints.ValidationPayload 获取 TypedMap 的值

如何解决从 Constraints.ValidationPayload 获取 TypedMap 的值

我们将 playframework 2.8 与 java 一起使用,并使用 DI 和有效负载实现了表单验证,如官方播放文档 https://www.playframework.com/documentation/2.8.x/JavaForms#Custom-class-level-constraints-with-DI-support

有效负载对象使用 getAttr() 方法提供一个包含来自请求的属性TypedMap。这由 this documentation

解释

由于 TypedKey 的实例用于在映射中存储值,我们无法访问由框架本身存储的任何请求属性。可以在 Githubthis Stackoverflow post

中找到更多详细信息

看来,不可能从 TypedMap 中获取所有现有的键。
那么,问题是:当我们没有 TypedKey 的实例时,我们如何获取已经由 play 存储的 TypedMap 的值?

解决方法

Request.attrs TypedMap 的键存储在 play.api.mvc.request.RequestAttrKey 对象中:

package play.api.mvc.request

import ...

/**
 * Keys to request attributes.
 */
object RequestAttrKey {

  /**
   * The key for the request attribute storing a request id.
   */
  val Id = TypedKey[Long]("Id")

  /**
   * The key for the request attribute storing a [[Cell]] with
   * [[play.api.mvc.Cookies]] in it.
   */
  val Cookies = TypedKey[Cell[Cookies]]("Cookies")

  /**
   * The key for the request attribute storing a [[Cell]] with
   * the [[play.api.mvc.Session]] cookie in it.
   */
  val Session = TypedKey[Cell[Session]]("Session")

  /**
   * The key for the request attribute storing a [[Cell]] with
   * the [[play.api.mvc.Flash]] cookie in it.
   */
  val Flash = TypedKey[Cell[Flash]]("Flash")

  /**
   * The key for the request attribute storing the server name.
   */
  val Server = TypedKey[String]("Server-Name")

  /**
   * The CSP nonce key.
   */
  val CSPNonce: TypedKey[String] = TypedKey("CSP-Nonce")
}

那些是 Scala 键。这不是大问题,java TypedMap 只是 scala TypedMap 的包装器。

来自 java 的示例用法,当我们有 Http.Request 时:


import scala.compat.java8.OptionConverters;
import play.api.mvc.request.RequestAttrKey;

class SomeController extends Controller {

    public Result index(Http.Request request) {

        //get request attrs  
        play.libs.typedmap.TypedMap javaAttrs = request.attrs();

        //get underlying scala TypedMap
        play.api.libs.typedmap.TypedMap attrs = javaAttrs.asScala();

        //e.g. get Session from scala attrs
        Optional<Cell<Session>> session = 
            OptionConverters.toJava(attrs.get(RequestAttrKey.Session()));

        //process session data
        session.ifPresent(sessionCell -> {
            Map<String,String> sessionsData = sessionCell.value().asJava().data();

        //do something with session data
        });
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。