1

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

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

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)
}

这一切都编译得很漂亮,但在运行时失败并出现com.novus.salat.util.ToObjectGlitch:在从 Mongo 解组期间参数类型不匹配。

如果我们简单地将伴随对象定义转换为包定义(封装 DTO 汤的一种稍微混乱的方式),那么一切都运行良好(解组是一种享受)。

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

4

2 回答 2

0

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

于 2012-04-23T16:23:36.557 回答
0

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

不起作用:

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

工作正常:

case class Description( /* etc etc */)
case class TestSalatDto(description: Description, /* etc etc*/)
于 2013-09-30T13:22:19.307 回答