同一案例类不同的验证

时间:2018-09-03 12:46:56

标签: mongodb scala akka-http case-class spray-json

我想在Scala 2.11和akka中做的是具有一个case类,但是根据被击中的路线进行两种不同的验证。

例如,让我们考虑下面的案例类

case class User(_id: String, name: String, age: Int, address: String)

现在在点击/create路线时,我不需要_id,但我需要所有其他字段。

但是在打/update路线时,我需要_id和要更新的字段(可以是一个或全部三个)

仅声明Option并没有达到目的,因为那样我的/create路线就折腾了。

即使扩展案例类也不能真正无缝地工作(代码重复过多)。

如果可能的话,我很乐意

case class User(_id: String, name: String, age: Int, address: String)

case class SaveUser() extends User {
    require(name.nonEmpty)
    require(age.nonEmpty)
    require(address.nonEmpty)
}

case class UpdateUser() extends User {
    require(_id.nonEmpty)
}

是否有一个优雅的解决方案?还是我必须创建两个相同的案例类?

1 个答案:

答案 0 :(得分:0)

我的建议是为不同的需求编码不同的案例类,但是如果您坚持必须在这两种案例之间共享代码,则可能的解决方案是对案例类进行参数化

case class User[Id[_], Param[_]](_id: Id[String], name: Param[String], age: Param[Int], address: Param[String])

然后,您为Identity类型构造函数定义别名,并定义case类的两种用法

type Identity[T] = T
type SaveUser = User[Option, Identity]
type UpdateUser = User[Identity, Option]