2012-04-23 33 views
1

我一直在使用一個Web應用程序Play2 MongoDB的互動(通過萊昂拉德利整潔的SBT插件)內薩拉特。很好,但是因爲我們有很多嵌套的case case DTO(爲了反映嵌套的JSON/BSON模型定義),所以我們想要在基本模型類型的伴隨對象中整齊地定義嵌套case類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湯稍微混亂的方式),那麼所有運行正常(解組工作可以)。

我很困惑,爲什麼在運行時聲明對象中的case類失敗;在對象中定義事例類(Salat DTO)有沒有訣竅?

+0

你仍然得到錯誤,如果您導入TestSalatDto._,然後直接使用說明?也許它需要在範圍內? – Brian 2013-02-14 01:58:58

回答

0

我不會嘗試在同一個源中有一個case類和一個同名單例。 case類創建它自己的compation對象,與你的Singleton衝突。我的解決辦法是沒有伴侶的對象,只是類TestSalatDtoDescription(無論是)

+0

嘿,我想宣佈在相同的源案例類同伴對象都OK,只是斯卡拉整齊合併你申報到默認的同伴,是案件類生成編譯器。 – DaveE 2012-04-24 12:43:43

+0

但他們仍然是我的大腦的衝突。也許編譯器與它的東西,但也可能是不可預測的,至少只要你不知道什麼是編譯器實際上它。 – Arne 2012-04-25 08:27:39

0

在這裏你的問題是,薩拉特當前不支持嵌套類。

不起作用:

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

正常工作:

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