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( "")を置くだけであることに注意してください。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
}

Unit does not take parameters問題は、traitからのメソッドがAction returnタイプである必要があることを理解しているので、次のように定義することになるという警告を受け取ることです。

    /**
 * 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...

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
}

アクションは、実際には、結果を返す関数を受け入れるシングルトンオブジェクトです。

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 に答える