Play框架表单只有18个参数

2023-11-26

我观察到,当我向 Play Framework Form-class 添加超过 18 个参数时,我会收到一个很长(对我来说难以理解)的编译错误。

这是有记录的限制吗?我需要在表单帖子中接收多达 29 个参数。我不决定参数的设计和数量,因为我正在实现开放标准的协议。

我这样映射:

val registration = Form(mapping(
    "client_type" -> nonEmptyText,
    "client_id" -> optional(nonEmptyText),
    ... up to 29 args, all optional(nonEmptyText)
    ){ (clientType, clientId ...) => RegistrationRequest(clientType, clientId ...) }
     { req => None })

我的策略是以这种方式进行映射而不是应用/取消应用并创建案例类的层次结构。原因是为了解决 Case 类中 22 个参数的限制,这是我遇到的第一个看似任意的限制。最多 18 个参数映射有效,之后我收到一个很长的编译错误。

错误消息可以在这里找到(太长,无法包含):https://gist.github.com/2928297

我正在寻找有关如何克服此限制的建议。我知道在 Post 表单中发送 29 个参数是糟糕的设计,但它应该仍然是可能的。


黑客/解决方法/解决方案

好吧,这是我破解的解决方法(写这篇文章比实现花费的时间要长得多,我为此破解了约 30 分钟)

我编写了预处理请求参数并添加组前缀来对某些参数进行分组的函数。然后,我使用生成的 Map[String, String] 并继续处理表单类,照常进行验证等。这允许我在映射中使用嵌套案例类并低于 18 个参数限制。

当心:前面的代码很丑陋!我可能不应该展示这样的早期黑客代码,但我希望它能帮助其他想要解决方法的人。

def preprocessFormParams(prefix:String, replace:String)(implicit request:Request[AnyContent]):Map[String, String] = request.body.asFormUrlEncoded.map( _.filterKeys( _.startsWith(prefix)).map( m => m._1.patch(0, replace, prefix.length)  -> m._2.head )).getOrElse(Map.empty)
def unprocessedFormParams(prefixes:Set[String])(implicit request:Request[AnyContent]):Map[String, String] = request.body.asFormUrlEncoded.map( _.filterKeys( !prefixes.contains(_) ).map( m => m._1 -> m._2.head )).getOrElse(Map.empty)

因此,这些函数可能应该用于理解或拆分,但这里是: preprocessedFormParms 采用前缀并替换它:

val clientParams = preprocessFormParams("client_", "client.")
("client_id" -> "val1", "client_type" -> "val2") becomes ("client.id" -> "val1", "client.type" -> "val2")

当我有 group.key1, group.key2 形式的参数时,我可以像这样以这样的形式嵌套案例类

Form(mapping("client" -> mapping("type" -> nonEmptyText
    "id" -> optional(nonEmptyText),
    "secret" -> optional(nonEmptyText))
    (RegisterClient.apply)(RegisterClient.unapply)
    ... more params ...)
    (RegisterRequest.apply)(RegisterRequest.unapply)

在我的行动中,我继续过滤掉我的每个组

implicit request =>
val clientParams = preprocessFormParams("client_", "client.")       
val applicationParams = preprocessFormParams("application_", "application.")
val unprocessedParams = unprocessedFormParams(Set("client_", "application_"))
val processedForm = clientParams ++ applicationParams ++ unprocessedParams

最后,我可以像平常一样应用我的表单,但现在我得到了嵌套结构 I,它减少了参数数量,并希望使案例类更易于管理。

clientRegistrationForm.bind(processedForm).fold( ... )

使用这种方法可以减少参数的数量。如果您的参数没有相同的前缀以便像我的问题一样轻松分组,那么您仍然可以使用相同的基本方法,但根据其他条件进行过滤。


The mapping您使用的方法不是单个方法,而是重载的。对于单个参数,它有两个类型参数,一个用于结果类型,一个用于您正在使用的元素。它构建了一个ObjectMapping1。对于两个参数,它具有三个类型参数,并且构造一个ObjectMapping2.

These ObjectMappingX类定义为ObjectMapping18,正如您所注意到的。您可以在 Play 的源代码中找到它play/api/data/Forms.scala

推荐的解决方案是避免这种大小的非嵌套形式。如果这是不可避免的,您可以使用与内置 Play 库不同的库,或者可以定义缺少的库ObjectMappingX对象和相应的方法来自己构造它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play框架表单只有18个参数 的相关文章

随机推荐

  • xsd.exe 将类生成为单独的文件?

    我有一组 xsd 文件 使用 xsd exe 生成类时 输出文件大约有 17000 行长 包含数百个部分类 为了简洁起见 xsd exe 甚至 Visual Studio 2010 是否可以将这些类拆分为一个单独的文件 我不知道使用 xsd
  • 如何使用 PDO 检查数据库中是否存在行?

    我想要一个条件 当该行根本不存在时执行某些操作 stmt conn gt prepare SELECT FROM table WHERE ID stmt gt bindParam 1 GET id PDO PARAM INT stmt gt
  • 允许用户仅在 Apache Superset 中查看与其相关的数据

    我的数据库中有一些与不同供应商相关的信息 我希望允许每个注册供应商 代表人 查看仅包含与他们相关的数据的切片 仪表板 一种可能的解决方案是为每个供应商创建单独的视图以及每个供应商的单独角色 但如果你有 100 多个供应商 就像我的情况 这感
  • 以编程方式将 CA 信任证书导入现有密钥库文件,而不使用 keytool

    我想创建一个 JAVA 程序 将 cer CA 导入到现有的密钥库文件中 这样最终用户可以更方便地插入CA证书 无需使用CMD和命令中的密钥 JAVA 代码可以在任何地方执行此操作吗 我尝试了一些方法 但仍然无法将证书导入java Cert
  • 如何找到元组列表中的最大值? [复制]

    这个问题在这里已经有答案了 我有一个包含 10 6 元组的列表 如下所示 101 153 255 827 361 961 X Y 我想找到最大值Y在此列表中 但还想了解X这是必然的 我该怎么做呢 operator itemgetter In
  • 在 bash 脚本中使用 virsh 更改 Virbr0 的 XML 文件中的 dhcp IP 范围

    我需要在 bash 脚本中更改 Virbr0 的 XML 配置文件的 dhcp 范围 可以使用命令 virsh net edit default 更改它 但我不知道如何从 bash 脚本完成它 对所提出问题的任何帮助或解释将不胜感激 预先感
  • Win 10 通用应用程序与 Cordova 尝试加载闪存

    我正在使用 Visual Studio 2015 和 Apache Cordova 工具构建跨平台 Cordova 应用程序 因此 我使用 Apache Cordova 工具中的 Blank Cordova 应用程序 带有 TypeScri
  • 输入类型=按钮上的背景颜色:悬停状态在 IE 中保持不变

    我有一个带有背景颜色设置的输入类型 按钮和一个不同的 悬停 请参阅http jsfiddle net hc2Eu 3 在 IE 所有版本 中 当我将鼠标放在按钮上时 移开按钮 然后松开鼠标 背景颜色保留在 hover 设置中 直到您再次将鼠
  • 使用jquery获取具有特定类名的所有选中的复选框

    我知道我可以使用以下方法获取页面上所有选中的复选框 input type checkbox each function var sThisVal this checked this val 但我现在在一个页面上使用它 该页面有一些我不想包含
  • 如何查找对象的大小(包括包含的对象)[重复]

    这个问题在这里已经有答案了 我想估计一个物体所占的大小 为了获得对象的大小我可以使用 为此 我可能会使用Instrumentation getObjectSize myObject 但这会给我一个 浅 尺寸 我想获取对象的大小 包括它引用的
  • ggplot2:如何获取回归线方程、r^2 和 p 值的值?

    我无法弄清楚如何获得我使用函数 geom smooth 绘制的线性回归的回归线方程 r 2 和 p 值 这是我的代码 g lt ggplot data data male aes x mid year y mean tc colour da
  • VB.NET 连接字符串(Web.Config、App.Config)

    连接字符串真的很烦人 我在一个解决方案中同时拥有两个项目 充当表示层的 Web 表单应用程序以及支持它的类库 用于从数据库发送和接收数据 类库项目中的 Employee 类 Friend Class Employee Public Func
  • 如何将 JSON 对象推送到 JSONB 列中的嵌套数组

    我需要以某种方式将 JSON 对象推送到可能存在的 JSON 对象的嵌套数组 请参阅下面的 JSON 片段中的 页面 session id someuuid visitor ui 1 pages datetime 2016 08 13T19
  • 如何在 MathJax 中定义自定义宏

    我正在尝试定义 MathJax 中 LaTeX 文件中使用的自定义宏 可以定义简单的宏 单个参数 没有任何问题 例如 newcommand braket 1 langle 1 rangle as Macros braket langle 1
  • Spring MVC - 包括静态文件/ javascript 、 css

    我已经创建了 MVC 应用程序 我想将js或css文件包含到jsp中 我的静态文件位于 webapp js jquery js WEB INF jsp jsp 我的包含 jquery 的代码是 jquery js gt gt 我无法将 js
  • Android 权限和权限组之间的链接

    我是 Android 开发新手 我正在查看 android 清单权限 有两件事 权限和权限组 我知道该列表位于 http developer android com reference android Manifest permission
  • 具有并发请求的 Python XMLRPC

    我正在寻找一种方法来防止多个主机向 Python XMLRPC 侦听器同时发出命令 侦听器负责运行脚本以在该系统上执行任务 如果多个用户尝试同时发出这些命令 这些任务将会失败 有没有办法可以阻止所有传入请求 直到单个实例完成 我认为 pyt
  • 在 NSString 对象中查找子字符串

    我有一个 NSString 对象 我想通过定位一个单词来从中创建一个子字符串 例如 我的字符串是 狗吃了猫 我希望程序找到单词 ate 并创建一个子字符串 the cat 有人可以帮助我或给我一个例子吗 Thanks Sagiftw NSR
  • 使用 C# 列出回收站中的文件名,而不使用任何外部文件

    我想要一个使用 c 代码检索回收站 在 win 7 上 中的文件名的函数 该框架似乎没有包含任何内容来实现这一目标 目录 Getfiles 不会起作用 是吗 我发现自己有一个使用 windows shell32自动化 的代码 但这需要提供i
  • Play框架表单只有18个参数

    我观察到 当我向 Play Framework Form class 添加超过 18 个参数时 我会收到一个很长 对我来说难以理解 的编译错误 这是有记录的限制吗 我需要在表单帖子中接收多达 29 个参数 我不决定参数的设计和数量 因为我正