我一直在Play2 web应用程序中使用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)的技巧?
我不会尝试在同一来源中使用案例类和同名的单例。case 类创建自己的比较对象,该对象与您的单例冲突。我的解决方案是没有配套对象,只有类 TestSalatDtoDescription(不管是什么)
您的问题是 Salat 目前不支持嵌套类。
不起作用:
object TestSalatDto {
case class Description(
brief: String,
full: String)
}
工作正常:
case class Description( /* etc etc */)
case class TestSalatDto(description: Description, /* etc etc*/)