B-Teck!

お仕事からゲームまで幅広く

【Scala/Play】PLAY2 + SLICK ハンズオンをやった

Play 2.5.x + Slick 3.1.x の手順をベースに「Play 2.8.x + Slick 3.3.2+(Play Slick 5.0.x)」の組み合わせでやってみた。
実装したものはこちら
バージョンを変えたことによってそのまま動かなかった箇所がいくつかあったので、メモとして残す。

プロジェクトの作成

Playの雛形作成は下記で2.8系を選択。

$ sbt new playframework/play-scala-seed.g8 --branch 2.8.x

build.sbt の記述の追記も合わせて変更している。

// ↓↓↓↓ここから追加↓↓↓↓  
libraryDependencies ++= Seq(  
  "com.h2database" % "h2" % "1.4.193",  
 "com.typesafe.play" %% "play-slick" % "5.0.0",  
 "com.typesafe.play" %% "play-slick-evolutions" % "5.0.0"  
)  
// ↑↑↑↑ここまで追加↑↑↑↑

DBの準備

  • H2がJDK11では動かず、JDK1.8環境に戻す必要があった
    • イントロダクションではJDK1.7以降と書いてあったので油断してた…

DB接続の設定

slick.dbs.default.driver がdeprecatedになっていたのでslick.dbs.default.profileに変更

slick.dbs.default.profile="slick.jdbc.H2Profile$"  

実装

UserControllerの雛形

package controllers

import models.Tables._  
import play.api.data.Forms._  
import play.api.data._  
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}  
import play.api.mvc._  
import slick.jdbc.H2Profile.api._  
import slick.jdbc.JdbcProfile  
  
import javax.inject.Inject  
import scala.concurrent.{ExecutionContext, Future}

class UserController @Inject()(implicit ec: ExecutionContext,
                                val dbConfigProvider: DatabaseConfigProvider,
                                components: MessagesControllerComponents) extends MessagesAbstractController(components)
  with HasDatabaseConfigProvider[JdbcProfile] {

  /**
   * 一覧表示
   */
  def list = TODO

  /**
   * 編集画面表示
   */
  def edit(id: Option[Long]) = TODO

  /**
   * 登録実行
   */
  def create = TODO

  /**
   * 更新実行
   */
  def update = TODO

  /**
   * 削除実行
   */
  def remove(id: Long) = TODO

}

  • play.api.libs.concurrent.Execution がdeprecated
    • scala.concurrent.ExecutionContext へ修正
  • play.api.i18n.MessagesApi がdeprecated
    • MessagesControllerComponentsMessagesAbstractController へ修正
  • slick.driver.JdbcProfile がdeprecated
    • slick.jdbc.JdbcProfile へ修正

JsonControllerの実装

package controllers

import controllers.JsonController._
import models.Tables
import models.Tables._
import play.api.db.slick._
import play.api.libs.functional.syntax.{toFunctionalBuilderOps, unlift}
import play.api.libs.json._
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}
import slick.jdbc.H2Profile.api._
import slick.jdbc.JdbcProfile

import javax.inject.Inject
import scala.concurrent.{ExecutionContext, Future}


class JsonController @Inject()(implicit ec: ExecutionContext, val dbConfigProvider: DatabaseConfigProvider, cc: ControllerComponents)
  extends AbstractController(cc) with HasDatabaseConfigProvider[JdbcProfile] {

  /**
   * 一覧表示
   */
  def list = TODO

  /**
   * ユーザ登録
   */
  def create = TODO

  /**
   * ユーザ更新
   */
  def update = TODO

  /**
   * ユーザ削除
   */
  def remove(id: Long) = TODO
}

変更点はUserControllerの修正とほぼ同じだが下記のみ異なる

  • Controller が利用できなくなっている
    • ControllerComponentsAbstractControllerへ修正

参考