Scala Play表单验证:必需的布尔值不是必需的

psi*_*yev 5 scala playframework playframework-2.0 playframework-2.1

我在Play中发现了有趣的东西!框架形式验证.例如,我有这样的形式:

case class Foo(mystring: String, myint: Int, mybool: Boolean) { // doing cool stuff here }
val myForm = Form(
    mapping(
      "mystring" -> text,
      "myint" -> number,
      "mybool" -> boolean
)(Foo.apply)(Foo.unapply))
Run Code Online (Sandbox Code Playgroud)

当我在我的Json中绑定没有"mybool"的数据时,验证会传递并创建一个"mybool = false"的对象.这是非常奇怪的行为,好像我将传递相同的数据,但没有"mystring"字段,我会得到Validation Errors: Map(mystring -> error.required)我期望看到的 - 因为字段丢失.

如果我使布尔字段可选,但我手动添加这样的检查:

"mybool" -> optional(boolean).verifying("mybool.required", _.isDefined)
Run Code Online (Sandbox Code Playgroud)

并且没有字段绑定数据我得到了预期的错误:

Validation Errors: Map(mybool -> mybool.required)
Run Code Online (Sandbox Code Playgroud)

示例数据集:

{
  "mystring": "stringHere",
  "myint": 33
}
Run Code Online (Sandbox Code Playgroud)

为什么需要检查不适用于布尔值?它的最佳解决方法是什么?这是一场比赛!我或者只是不明白的东西?

谢谢你的回答.

est*_*tic 3

我想这是设计使然。通常,如果您有一个布尔字段,那么您会将其绑定到 HTML 复选框。如果在提交表单时选中该框,那么一切都会按预期进行;但是,如果未选中该框,则浏览器不会随提交的数据一起发送字段名称。基本上,未选中的框和根本不存在的元素之间没有什么区别,因此 Play 必须假设(对于布尔字段)该值为“false”。