我一直在 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)是否有技巧?