Cri*_*riu 2 scala playframework-2.0
在Play 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("")
}
}
Run Code Online (Sandbox Code Playgroud)
(请注意,我只是把OK("")编译,我必须实现它们,就像我实现list方法一样).
我想为所有这些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
}
Run Code Online (Sandbox Code Playgroud)
问题是我收到一条警告,Unit does not take parameters
所以我明白我的trait方法应该有一个Action返回类型,所以我最终定义它们如下:
/**
* 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
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免在这样的特征中定义方法?因为那时我必须override
在我的班级中使用.我主要想implement
不要override
那些方法......
没有返回类型的抽象方法将返回Unit,因此您所要做的就是将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
}
Run Code Online (Sandbox Code Playgroud)
Action实际上是一个单例对象,它接受一个返回Result的函数.
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]
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
430 次 |
最近记录: |