Play 2.2 を使用して Scala でアプリケーションを作成しています。play-slick 0.5.0.8
MySQL DB コネクタとして使用しています。次のアプリケーションコントローラーがあります。
package controllers
import models._
import models.database._
import play.api._
import play.api.mvc._
import play.api.Play.current
import play.api.db.slick._
object Application extends Controller {
// WORKS:
def test = DBAction {
implicit session => Ok(views.html.test(Cameras.findById(1)))
}
// DOES NOT WORK:
def photo = Action {
val p = PhotoFetcher.fetchRandomDisplayPhoto(someParametersBlah))
Ok(views.html.photo(p))
}
}
ご覧のとおり、test
DBAction は機能し、DB から写真を正常に取得できます。残念ながら、photo
アクションは機能しません。
私PhotoFetcher.fetchRandomDisplayPhoto(blah)
はたくさんの異なることをします。その内部に埋め込まれているのは への呼び出しで、オブジェクトCameras.findById(blah)
を返す必要があります ( DBAction で動作します)。ただし、この構成では次のエラーが発生します。Camera
test
could not find implicit value for parameter s: slick.driver.MySQLDriver.simple.Session
photo
次のように、アクションを DBAction にしようとしました。
def photo = DBAction {
implicit session => {
val p = PhotoFetcher.fetchRandomDisplayPhoto(someParametersBlah))
Ok(views.html.photo(p))
}
}
しかし、それは同じセッションの欠落エラーになります。PhotoFetcher が暗黙的なセッションを認識していないようです。
私が試したもう1つのことは、にインポートslick.session.Database.threadLocalSession
することPhotoFetcher
ですが、次のエラーのみが発生します。
SQLException: No implicit session available; threadLocalSession can only be used within a withSession block
それが助けになる場合、これは私のCameras
オブジェクトの簡略化されたバージョンです:
package models.database
import models.Format.Format
import scala.slick.driver.MySQLDriver.simple._
case class Camera(id: Long,
otherStuff: String)
trait CamerasComponent {
val Cameras: Cameras
class Cameras extends Table[Camera]("cameras") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def otherStuff = column[String]("otherStuff", O.NotNull)
def * = id ~ otherStuff <> (Camera.apply _, Camera.unapply _)
val byId = createFinderBy(_.id)
val byOtherStuff = createFinderBy(_.otherStuff)
}
}
object Cameras extends DAO {
def insert(camera: Camera)(implicit s: Session) { Cameras.insert(camera) }
def findById(id: Long)(implicit s: Session): Option[Camera] = Cameras.byId(id).firstOption
def findByOtherStuff(otherStuff: String)(implicit s: Session): Option[Camera] = Cameras.byOtherStuff(model).firstOption
}
というわけで、どこかでズレてしまったようです。現在、DAO オブジェクトに Controller DBAction から直接アクセスすることのみが可能であり、別のクラス内からはアクセスできません。どんな助けでも大歓迎です。ありがとう!