我可以使用配套对象来管理Salat案例类DTO的范围吗?

时间:2012-04-23 13:38:45

标签: scala playframework playframework-2.0 salat

我在Play2 webapp中使用Salat进行MongoDB交互(通过Leon Radley的简洁SBT插件)。效果很好,但是由于我们有许多案例类DTO,因为嵌套(镜像嵌套的JSON / BSON模型定义),我们希望在基础模型类型的伴随对象中整齐地定义嵌套的案例类DTO。

这可以防止在我们的Salat数据访问层中激增的案例类DTO中的命名空间冲突。例如,我们定义了一个"描述" case类,但它被重新定义为不同的模型对象,所以我们想要一种简洁的方法来命名它。我们尝试使用配套对象来实现此目的,就像在这个小片段/示例中一样:

package models.mongo

import com.novus.salat._
import com.mongodb.casbah.Imports._
import se.radley.plugin.salat._

case class TestSalatDto(
  id: ObjectId = new ObjectId,
  title: String,
  description: TestSalatDto.Description)

object TestSalatDto {
  case class Description(
    brief: String,
    full: String)
}

这一切都编译得很漂亮,但在运行时因Mongo解组而导致 com.novus.salat.util.ToObjectGlitch:参数类型不匹配失败。

如果我们只是简单地将伴侣对象定义切换为包装定义(一种稍微麻烦的封装DTO汤的方式),那么一切运行正常(解组工作就可以了。)

我很困惑为什么声明Object中的case类在运行时失败了;是否有一个在对象中定义案例类(Salat DTO)的技巧?

2 个答案:

答案 0 :(得分:0)

我不会尝试在同一个源中有一个case类和一个同名的Singleton。 case类创建它自己的compation对象,它与你的Singleton冲突。我的解决方案是没有伴侣对象,只有类TestSalatDtoDescription(无论是什么)

答案 1 :(得分:0)

你的问题是Salat目前不支持嵌套类。

不起作用:

object TestSalatDto {
  case class Description(
  brief: String,
  full: String)
}

工作正常:

case class Description( /* etc etc */)
case class TestSalatDto(description: Description, /* etc etc*/)