玩 2.4 表单字段值绑定到 java.time.LocalDate 类型

Posted

技术标签:

【中文标题】玩 2.4 表单字段值绑定到 java.time.LocalDate 类型【英文标题】:Play 2.4 Form field value bind to type java.time.LocalDate 【发布时间】:2015-11-18 09:24:53 【问题描述】:

我正在尝试创建一个包含值类型为 java.time.LocaDate 的字段的表单。

def javaLocalDateForm = Form(single(
  "date" -> of[LocalDate]
))

但是,它给了我一个编译错误。

Cannot find Formatter type class for java.time.LocalDate. Perhaps you will need to import play.api.data.format.Formats._ 

尝试导入 play.api.data.format.Formats._ 但编译器仍然给我同样的错误。

有什么方法可以将表单字段值绑定到 java.time.LocalDate?

【问题讨论】:

【参考方案1】:

看起来 Joda 的 LocalDatejava.util.Date 有预定义的 Formatters,但 Java 8 LocalDate 类(还没有)。

因此,您可以使用 Joda 库(目前),或者构建自己的 Formatter[java.time.LocalDate],可能通过包装其他预定义的 Formatters 之一并转换为 Java LocalDate 类。

【讨论】:

【参考方案2】:

我做到了

class LocalDateFormatter extends play.api.data.format.Formatter[LocalDate] 
  import play.api.data.FormError

  override def bind(key: String, data: Map[String, String]): Either[Seq[FormError], LocalDate] = try
    Right(
      LocalDate.parse(data(key))
    )
  
  catch
    case _:Throwable => Left(Seq(new FormError(key, Seq("error.date"))))
  

  override def unbind(key: String, value: LocalDate): Map[String, String] = Map(key -> value.toString)

然后

// play scala form binders
object UtilsDate
  import play.api.data.FieldMapping
  def of[DateTime](implicit binder: play.api.data.format.Formatter[DateTime]): FieldMapping[DateTime] = FieldMapping[DateTime]()(binder)
  val formBinder = of(new LocalDateFormatter())

然后你可以在你的代码中使用

val myForm = Form(tuple("name" -> nonEmptyText, "date" -> UtilsDate.formBinder))

【讨论】:

以上是关于玩 2.4 表单字段值绑定到 java.time.LocalDate 类型的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将日期字段绑定到具有 2 列的“值列表”组合框?

玩! 2.4 添加补充配置文件

将表单值传递给更新查询而不更新表中的空白字段

CakePHP 2.4:不需要的预填充表单数据

可以将keyup绑定到整个表单吗?

INSERT INTO 查询不能包含多值字段