1

私は、MongoDB とのやり取りのために Play2 webapp 内で Salat を使用しています (Leon Radley のきちんとした SBT プラグインを介して)。うまく機能しますが、ネスト (ネストされた JSON/BSON モデル定義を反映するため) のために多くのケース クラス DTO があるため、ネストされたケース クラス DTO を基本モデル タイプのコンパニオン オブジェクトでき​​ちんと定義したいと考えました。

これにより、Salat データ アクセス レイヤーで急増したケース クラス DTO のスープでの名前空間の衝突が防止されます。たとえば、"Description" ケース クラスを定義しますが、別のモデル オブジェクトに対して再定義されるため、適切な方法で名前を付ける必要がありました。この小さなスニペット/例のように、この目的のためにコンパニオン オブジェクトを使用してみました。

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

同じソースに同じ名前のケースクラスとシングルトンを持たせようとはしません。ケース クラスは、シングルトンと競合する独自の compation オブジェクトを作成します。私の解決策は、コンパニオンオブジェクトなしで、クラス TestSalatDtoDescription (それが何であれ)だけです

于 2012-04-23T16:23:36.557 に答える