Scala中的Rest类的Scala特征

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那些方法......

Bla*_*son 5

没有返回类型的抽象方法将返回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)