【问题标题】:Play 2.4 Form field value bind to type java.time.LocalDate玩 2.4 表单字段值绑定到 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?

【问题讨论】:

    标签: scala playframework-2.4


    【解决方案1】:

    看起来 Joda 的 LocalDate 和 java.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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-13
        • 2016-08-25
        • 1970-01-01
        • 2012-09-02
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多