Mer*_*ith 1 casting scala playframework slick
我有一个看起来像这样的Play表单:
val form = Form( tuple(
/* 5 more fields */
"dueDate" -> optional(date)
) )
Run Code Online (Sandbox Code Playgroud)
我正试图"dueDate"在Slick中插入一个对象.
newAuditForm.bindFromRequest.fold(
errors => BadRequest(views.html.error(form)),
success => {
Database.forDataSource(DB.getDataSource()) withSession {
Things.forInsert.insert Thing(
(success._6).asInstanceOf[Option[java.sql.Date]]
)
}
}
)
Run Code Online (Sandbox Code Playgroud)
Slick只处理java.sql.Date,而Play只处理对象java.util.Date中的(?)Form.
使用asInstanceOf回报:
ClassCastException: java.util.Date cannot be cast to java.sql.Date
Run Code Online (Sandbox Code Playgroud)
必须有一种方法让我为这个演员编写规则是可能的......我是否需要编写一个新的模式匹配规则?
你不能转换java.util.Date为java.sql.Date因为java.sql.Date是一个子类.你可以做的是创建一个新的实例java.sql.Date:
val x = new java.util.Date()
val y = new java.sql.Date(x.getTime())
Run Code Online (Sandbox Code Playgroud)
如果您认为有用,可以定义隐式转换:
implicit def date2sqlDate(d: java.util.Date) = new java.sql.Date(d.getTime())
Run Code Online (Sandbox Code Playgroud)
但是,这不会在选项内转换(演员也不会工作,因为它不是演员而是转换).
你可以:
val x: Option[java.util.Date]
x.map(_: java.sql.Date) // using implicit conversion
Run Code Online (Sandbox Code Playgroud)
或者只是明确地写出来:
x.map(d => new java.sql.Date(d.getTime()))
Run Code Online (Sandbox Code Playgroud)
如果你需要转换非常频繁,你可能会考虑从写的隐式转换Option[java.util.Date]到Option[java.sql.Date].