玩 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 的 LocalDate
和 java.util.Date
有预定义的 Formatter
s,但 Java 8 LocalDate
类(还没有)。
因此,您可以使用 Joda 库(目前),或者构建自己的 Formatter[java.time.LocalDate]
,可能通过包装其他预定义的 Formatter
s 之一并转换为 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 类型的主要内容,如果未能解决你的问题,请参考以下文章