我正在尝试创建一个包含值类型为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?
答案 0 :(得分:2)
对于Joda的Formatter
和LocalDate
,看起来有预先定义的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))