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
MessagesControllerComponents
、MessagesAbstractController
へ修正
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
が利用できなくなっている
ControllerComponents
、AbstractController
へ修正
参考
- ライブラリのバージョン参考
- Play 2.5.xのコードを2.8.xで動かすときのマイグレーション参考
- JsonControllerのコンパニオンオブジェクトがうまく動かなかった