2

在 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("")
  }
}

(请注意,我只是把 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,所以我明白我的 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
}

有没有办法避免像这样在 trait 中定义方法?因为那时我必须override在我的课堂上使用。implement我主要不想override那些方法......

4

1 回答 1

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
}

Action 实际上是一个单例对象,它接受一个返回结果的函数。

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]
}
于 2012-11-26T09:24:33.663 回答