【问题标题】:Can I manage the scope of Salat case class DTOs by using a companion Object?我可以使用伴随对象来管理 Salat 案例类 DTO 的范围吗?
【发布时间】:2012-04-23 13:38:44
【问题描述】:

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

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

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: argument type mismatch

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

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

【问题讨论】:

  • 导入TestSalatDto._,然后直接使用Description,还会报错吗?也许它需要在范围内?

标签: scala playframework playframework-2.0 salat


【解决方案1】:

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

【讨论】:

  • 嘿,我认为在与案例类相同的源中声明一个伴生对象是可以的,Scala 只是巧妙地将您声明的内容合并到编译器为案例类生成的默认伴生对象中。
  • 但它们仍然是我大脑的冲突。也许编译器会用它做些什么,但它可能是不可预测的,至少只要你不知道编译器实际上用它做了什么。
【解决方案2】:

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

不起作用:

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

工作正常:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2017-02-23
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多