3

Play アプリケーションで Slick 1.0 から Slick 2.0 にアップグレードする際に問題があります。

私のアプリには、ユーザー定義型の例がいくつかあります。

sealed trait UserStatus

case object NewUser extends UserStatus
case object ActiveUser extends UserStatus
case object BlockedUser extends UserStatus

object UserStatus extends SerializableEnum[UserStatus] {
  def mapping = Map[String, UserStatus](
    "NEW" -> NewUser,
    "ACTIVE" -> ActiveUser,
    "BLOCKED" -> BlockedUser
  )
}

slick 1.0 の汎用マッパー:

trait SerializableEnum[T] {
  def mapping: Map[String, T]

  def reverseMapping = mapping.map(_.swap)

  implicit def enumWrites = new Writes[T] {
    def writes(o: T): JsValue = JsString(reverseMapping(o))
  }

  implicit val enumReads = new Reads[T] {
    def reads(json: JsValue): JsResult[T] = json match {
      case JsString(s) => JsSuccess(mapping(s))
      case _ => JsError("Enum type should be of proper type")
    }
  }
  implicit val enumTypeMapper = MappedTypeMapper.base[T, String](reverseMapping, mapping)
}

Slick 2.0 への移行後、新しいマッパーが機能しませんでした:

trait SerializableEnum[T] {
  def mapping: Map[String, T]

  def reverseMapping:Map[T,String] = mapping.map(_.swap)

  implicit def enumWrites = new Writes[T] {
    def writes(o: T): JsValue = JsString(reverseMapping(o))
  }

  implicit val enumReads = new Reads[T] {
    def reads(json: JsValue): JsResult[T] = json match {
      case JsString(s) => JsSuccess(mapping(s))
      case _ => JsError("Enum type should be of proper type")
    }
  }
  implicit val enumTypeMapper = MappedColumnType.base[T, String](reverseMapping, mapping)
}

コンパイラは次のように述べています。

No ClassTag available for T

trait に ClassTag タイプを定義することはできません。誰かがそれを解決する方法を知っていますか?

このためのサンプルアプリを用意しました: https://github.com/mgosk/slick-test

4

0 に答える 0