玩2.6 ActionBuilder

per*_*tom 15 scala playframework actionbuilder

我今天将我的Pl​​ay应用程序从2.5升级到2.6,我遇到了ActionBuilder的问题.文档说明:

已修改Scala ActionBuilder特征以将主体类型指定为类型参数,并添加抽象解析器成员作为默认主体解析器.您需要修改ActionBuilders并直接传递正文解析器.

文件

可悲的是,我没有找到任何例子,我不知道如何解决这个问题:

class AuthenticatedRequest[A](val token: ProfileTokenData, request: Request[A]) extends WrappedRequest[A](request)

trait Secured {

  object SetExtractor {
    def unapplySeq[T](s: Set[T]): Option[Seq[T]] = Some(s.toSeq)
  }

  def Authenticated = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] = {
      request.jwtSession.claimData.asOpt[JWTToken] match {
        case Some(token) => block(new AuthenticatedRequest(ProfileTokenData(null, token.sub, AuthRole.None), request)).map(_.refreshJwtSession(request))
        case _ => Future.successful(Unauthorized)
      }
    }
  }

  def Registered = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin, AuthRole.Customer, AuthRole.Registered))
  }

  def Customer = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin, AuthRole.Customer))
  }

  def Admin = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin))
  }

}
Run Code Online (Sandbox Code Playgroud)

有谁知道我必须传递BodyParser作为第二个参数?

lon*_*uro 15

有类似的问题.Play 2.6注入一个ControllerComponents,它有一个默认的主体解析器.也许这有助于:

class CheckApiKey(apiKeyToCheck: String, cc: ControllerComponents)
  extends ActionBuilder[Request, AnyContent] with ActionFilter[Request] {
  ...
  override protected def executionContext: ExecutionContext = cc.executionContext
  override def parser: BodyParser[AnyContent] = cc.parsers.defaultBodyParser
}
Run Code Online (Sandbox Code Playgroud)