关于scala:将Play框架表单元素映射为自定义类型

Mapping Play Framework form element to custom type

我想将表单元素映射到java.sql.Time,就像我能够映射java.sql.Date一样。我有以下代码:

1
2
3
4
5
6
7
  case class Item (timeField: java.sql.Time, dateField: java.sql.Date)
  val itemForm = Form(
    mapping(
     "timeField" -> sqlDate("H:mm"),
     "dateField" -> sqlDate("yyyy\\M\\d")
    )(Item.apply)(Item.unapply)
  )

映射do dateField效果很好,但是可以创建自定义映射,例如时间领域?我期待这样的事情

1
2
3
4
5
6
  val itemForm = Form(
    mapping(
     "timeField" -> sqlTime("H:mm"), //my own mapping function
     "dateField" -> sqlDate("yyyy\\M\\d")
    )(Item.apply)(Item.unapply)
  )

您可以使用自定义格式化程序来实现。代码看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
def sqlTime(pattern: String) = of(sqlTimeFormat(pattern))

def sqlTimeFormat(pattern: String): Formatter[java.sql.Time] = new Formatter[java.sql.Time] {
  def bind(key: String, data: Map[String, String]) = {
    try {
      val sdf = new SimpleDateFormat(pattern)
      Right(new java.sql.Time(sdf.parse(data.getOrElse(key,"")).getTime))
    } catch {
      case e: Exception => Left(List(FormError(key,"Your error message")))
    }
  }
  def unbind(key: String, value: java.sql.Time) = Map(key -> value.formatted(pattern))
}

注意:我还没有测试过,您可能需要做一些调整,但是应该将其关闭。