gpt4 book ai didi

Play 中 Rest 类的 Scala 特性

转载 作者:行者123 更新时间:2023-12-02 05:23:05 26 4
gpt4 key购买 nike

在 Play Framework 项目中,我有用于处理 REST 请求的 Controller ,例如:

 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 中定义方法?因为那时我必须在我的类(class)中使用 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
}

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]
}

关于Play 中 Rest 类的 Scala 特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13561382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com