将 Play Framework 表单元素映射到自定义类型
Mapping Play Framework form element to custom type
我想将表单元素映射到 java.sql.Time
,就像我能够映射 java.sql.Date
一样。我有以下代码:
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
效果很好,但是否可以创建自定义映射,例如对于时间字段?我期待这样的事情
val itemForm = Form(
mapping(
"timeField" -> sqlTime("H:mm"), //my own mapping function
"dateField" -> sqlDate("yyyy\M\d")
)(Item.apply)(Item.unapply)
)
您可以使用自定义格式化程序实现此目的。代码看起来像这样:
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))
}
注意:我还没有测试过这个,你可能需要做一些调整,但应该很接近。
我想将表单元素映射到 java.sql.Time
,就像我能够映射 java.sql.Date
一样。我有以下代码:
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
效果很好,但是否可以创建自定义映射,例如对于时间字段?我期待这样的事情
val itemForm = Form(
mapping(
"timeField" -> sqlTime("H:mm"), //my own mapping function
"dateField" -> sqlDate("yyyy\M\d")
)(Item.apply)(Item.unapply)
)
您可以使用自定义格式化程序实现此目的。代码看起来像这样:
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))
}
注意:我还没有测试过这个,你可能需要做一些调整,但应该很接近。