2012-11-26 115 views
2

休息級在玩Framework項目,我有處理REST請求控制器,一個例子是:斯卡拉特質在播放

object AddressBean extends Controller with RestTrait{ 

    def list = Action { 
    val list = Addresses.findAll() 
    Ok(Json.toJson(list.map(s => Json.toJson(s)(AddressJson.addressWrites)))) 
    } 

    def create = Action { 
    Ok("") 
    } 
} 

(請注意,我只是把OK(「」)編譯,我必須執行它們,就像我實現的列表方法)。

我想定義一個特點,所有這些REST類來實現同樣的方法,我開始喜歡:

/** 
* Define an interface for all of our REST classes. 
*/ 
trait RestTrait extends Controller{ 
    /** 
    * List entities. 
    */ 
    def list 
    /** 
    * Create entity. Get entity from request.body 
    */ 
    def create 

    //and so on 
} 

的問題是,我收到一條警告說Unit does not take parameters讓我明白,我從特質方法

/** 
* Define an interface for all of our REST classes. 
*/ 
trait RestTrait extends Controller{ 
    /** 
    * List entities. 
    */ 
    def list = Action{ 
     Ok("") 
    } 
    /** 
    * Create entity. Get entity from request.body 
    */ 
    def create = Action{ 
     Ok("") 
    } 

    //and so on 
} 

是不是有什麼辦法避免這樣的特質定義方法:所以我最終確定他們想應該有一個動作的返回類型?因爲那時我必須在我的課程中使用override。我主要想implement而不是override那些方法...

回答

5

沒有返回類型的抽象方法將返回單位,所以你所要做的就是添加返回類型的Action [AnyContent]到你的方法。

trait RestTrait extends Controller{ 
    /** 
    * List entities. 
    */ 
    def list:play.api.mvc.Action[play.api.mvc.AnyContent] 

    /** 
    * Create entity. Get entity from request.body 
    */ 
    def create:play.api.mvc.Action[play.api.mvc.AnyContent] 

    //and so on 
} 

動作實際上是一個單一對象,它接受一個返回結果的函數。

object Action extends java.lang.Object with scala.ScalaObject { 
... 
    def apply(block : scala.Function1[play.api.mvc.Request[play.api.mvc.AnyContent], play.api.mvc.Result]) : play.api.mvc.Action[play.api.mvc.AnyContent] 
    def apply(block : => play.api.mvc.Result) : play.api.mvc.Action[play.api.mvc.AnyContent] 
}