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

时间:2015-11-18 09:24:53

标签: scala playframework-2.4

我正在尝试创建一个包含值类型为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?

2 个答案:

答案 0 :(得分:2)

对于Joda的FormatterLocalDate,看起来有预先定义的java.util.Date,但对于Java 8 LocalDate类,还没有(尚未)

所以你可以使用Joda库(现在),或者构建你自己的Formatter[java.time.LocalDate],可能是通过绕过其中一个预定义的Formatter并转换为Java {{ 1}} class。

答案 1 :(得分:0)

我做了

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))