psi*_*yev 2 forms mapping scala playframework playframework-2.0
我正在寻找一种方法,为一个案例类使用两种不同的形式.我试图用额外的构造函数做到这一点,但失败了.看一下代码片段:
case class LoginDetails(password: String, field3: Option[Int], field4: String)
case class User(username: String, loginDetails: LoginDetails) {
def this(username: String, password: String, field3: Option[Int], field4: String) = this(username, LoginDetails(password, field3, field4))
// some logic inside
}
val loginDetailsForm = Form(
mapping(
"password" -> text,
"field3" -> optional(number),
"field4" -> text
)(LoginDetails.apply)(LoginDetails.unapply))
val oldForm = Form(
mapping(
"username" -> email,
"password" -> text,
"field3" -> optional(number),
"field4" -> text
)(User.apply)(User.unapply))
val newForm = Form(
mapping(
"username" -> email,
"loginDetails" -> loginDetailsForm.mapping
)(User.apply)(User.unapply))
Run Code Online (Sandbox Code Playgroud)
我要做的是支持两个API(新的和旧的),但如果我将拥有相同案例类的两个副本,我将不得不在其余的代码中的许多地方重复代码逻辑.如果有办法做到这一点?
当然,鉴于代码不起作用,并像一个例子一样使用.
谢谢!
您可以尝试添加方法applyOld
和unapplyOld
伴侣对象,如下所示:
case class User(username: String, loginDetails: LoginDetails)
object User {
def applyOld(username: String, password: String, field3: Option[Int], field4: String) = new User(username, LoginDetails(password, field3, field4))
def unapplyOld(u: User): Option[(String, String, Option[Int], String)] =
Some((u.username, u.loginDetails.password, u.loginDetails.field3, u.loginDetails.field4))
}
Run Code Online (Sandbox Code Playgroud)
你只需要方法(String, String, Option[Int], String) => User
和User => Option[(String, String, Option[Int], String)]
,你可以在任何地方,你喜欢把他们.例如,您可以UserOld
使用方法apply
和创建对象unapply
.
用法:
val oldForm = Form(
mapping(
"username" -> email,
"password" -> text,
"field3" -> optional(number),
"field4" -> text
)(User.applyOld)(User.unapplyOld))
val newForm = Form(
mapping(
"username" -> email,
"loginDetails" -> loginDetailsForm.mapping
)(User.apply)(User.unapply))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
990 次 |
最近记录: |