2012-04-23 7 views
1

私はPlay2ウェブアプリケーション内でSalongをMongoDBとのやり取り(Leon RadleyのきちんとしたSBTプラグイン経由)で使っています。ただし、ネストされたJSON/BSONモデル定義を反映するために、ネストされたケースDTOが多いため、ネストされたケースクラスDTOをベースモデルタイプのコンパニオンオブジェクトでき​​ちんと定義する必要がありました。コンパイルオブジェクトを使用してSalatケースクラス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)を定義するトリックはありますか?

+0

あなたがTestSalatDto._をインポートする場合、まだエラーを取得し、その後、直接説明を使用していますか?多分それは範囲にある必要がありますか? – Brian

答えて

0

私は同じソースの同じ名前のケースクラスとシングルトンを持つことを試みません。ケースクラスは、シングルトンと競合する独自のコンパイルオブジェクトを作成します。私のソリューションは、コンパニオンオブジェクトなしで、TestSalatDtoDescriptionクラス(それが何であれ)

+0

ちょっと、私はケースクラスと同じソースでコンパニオンオブジェクトを宣言していると思うのですが、Scalaは、あなたが宣言したものをケースクラス用に生成されたコンパイラのデフォルトコンパニオンにマージします。 – DaveE

+0

しかし、彼らはまだ私の脳の葛藤です。おそらくコンパイラが何かをしているかもしれませんが、コンパイラが実際に何をしているか分からない限り、予測できないかもしれません。 – Arne

0

ここでの問題は、現在Salatがネストされたクラスをサポートしていないことです。

は動作しません:

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

作品罰金:

case class Description(/* etc etc */) 
case class TestSalatDto(description: Description, /* etc etc*/) 
関連する問題