我在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)的技巧?
答案 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*/)