前提・実現したいこと
PlayFrameWorkのActionBuilderを使った、独自Actionの作成で詰まっています。
play-scala-secure-session-example
を参考に
sessionの確認と
送られてきたrequestを適当なオブジェクトに入れる
の2つのことを独自アクションでやりたいと思いましたが
コンパイルエラーをうまく解決できませんでした。
どうしたらコンパイルエラーを解決できるでしょうか
該当のソースコード
scala
1import javax.inject.{Inject, Singleton} 2import play.api.i18n.MessagesApi 3import play.api.libs.json.Json 4import play.api.mvc._ 5 6import scala.concurrent.{ExecutionContext, Future} 7 8case class Bbb(a: String, b: Int) 9object Bbb{ 10 implicit val bbbReads = Json.reads[Bbb] 11} 12 13class AaaController @Inject()(cccAction: CccAction) extends InjectedController { 14 15// これを 16 def Aaa = Action { request => 17 request.session.get("session")match { //sessionの確認 18 case None => BadRequest 19 case Some(_) => 20 request.body.asJson.flatMap(r => r.validate[Bbb].asOpt)match { //送られてきたrequestを適当なオブジェクトに入れる 21 case None => BadRequest 22 case Some(bbb) => 23 Ok(bbb) //このあといろいろ処理をやる想定だけどとりあえず今はOkを返す 24 } 25 } 26 } 27 28// ↓ のような形にしたい 29 def Aaa_ = cccAction{ bbb => 30 Ok(bbb) 31 } 32 33} 34 35//sessionの確認 36//送られてきたrequestを適当なオブジェクトに入れる 37//の2つを独自アクションでやるようにしたい 38@Singleton 39class CccAction @Inject()(playBodyParsers: PlayBodyParsers,messagesApi: MessagesApi) 40 (implicit val executionContext: ExecutionContext) 41 extends ActionBuilder[Bbb,AnyContent] with Results{ 42 43 override def parser: BodyParser[AnyContent] = playBodyParsers.anyContent 44 45// Bbb[A] をBbb とすると Method 'invokeBlock' overrides nothing と言われる 46 override def invokeBlock[A](request: Request[A], block: Bbb => Future[Result]): Future[Result] = { 47 request.session.get("session")match { 48 case None => Future.successful(Results.Status(400)) 49 case Some(_) => 50// asJsonがAaaControllerの中では問題なかったのに 51// 解決できないシンボル asJson と言われる 52 request.body.asJson.flatMap(r => r.validate[Bbb].asOpt)match { 53 case None => Future.successful(Results.Status(400)) 54 case Some(bbb) => block(bbb) 55 } 56 } 57 } 58}
補足情報(FW/ツールのバージョンなど)
PlayFramework 2.7
scala 2.12.8
あなたの回答
tips
プレビュー