我正在迁移到Play 2.6,并具有以下曾经起作用的控制器功能:
object Accounts extends Controller with API {
def all = superUser {
implicit principal =>
api {
request =>
models.Account.all
}
}
}
并收到此错误:
[error] could not find implicit value for parameter parser: play.api.mvc.BodyParser[Any]
[error] def all = superUser {
[error] ^
其中:
def superUser[A](f: => Principal => Request[A] => Result)(implicit parser: BodyParser[A]): SecureAction[A] = {
_superUser {
user =>
implicit val principal = data.Principal(user)
Action(parser)(request => f(principal)(request))
}
}
private def _superUser[A](action: String => Action[A]) = {
play.api.mvc.Security.Authenticated(getSuperUser, onUnauthorized)(action)
}
有关api
包装函数是什么的更多信息,请参见相关问题required: play.api.mvc.Request[?] => play.api.mvc.Result。
问题是为什么隐式参数解析器不在范围内?再次,这曾经起作用。
答案 0 :(得分:0)
superUser
期望A
的主体解析器实例。在这种情况下,A
是您要返回的模型。
让我们说models.Account.all
返回List[Account]
。现在为Account
类提供json主体解析器。现在,此正文解析器需要对帐户Reads[Account]
object Accounts extends Controller with API {
def all = superUser { implicit principal =>
api(request => models.Account.all)
} (parse.json[Account])
}
答案 1 :(得分:0)
首先,尝试扩展AbstractController,BaseController或InjectedController而不是Controller(已弃用)。
Play 2.6的控制器上没有隐含BodyParsers,但是您可以通过控制器变量 parse 访问默认解析器。
如果您需要任何T的BodyParser,则需要提供对其的访问。
您使用的是2.6之前的版本?
答案 2 :(得分:0)
我尝试了以下操作:
import com.google.inject.Inject
import com.google.inject.Singleton
@Singleton
class Accounts @Inject() (components: ControllerComponents) extends AbstractController(components) with API {
def all = superUser { implicit principal =>
api(request => models.Account.all)
} (parse.anyContent)
}
现在可以编译而不会出现错误。我还没有测试它,因为我要修复另一个错误(请参见上面的链接)。
Accounts
曾经是object
,但现在是Singleton class
。有人对此实施方式有意见吗?