автоматическое кодирование/декодирование JSON с классами случаев, созданными slick-codegen

Я создал свою модель scala из базы данных с помощью slick-codegen. Теперь поколение картографов Json терпит неудачу. Как не делать все вручную?

круг:

could not find implicit value for parameter encoder: io.circe.Encoder[UserController.this.db.UsersRow

play-json:

implicit val userFormat = Json.format[models.Tables#UsersRow]
No unapply or unapplySeq function found for class UsersRow: <none> / <none>

Код, сгенерированный slick-codegen, выглядит так:

package models

object Tables extends {
  val profile = slick.jdbc.PostgresProfile
} with Tables

trait Tables {
  val profile: slick.jdbc.JdbcProfile
  import profile.api._

  case class UsersRow(id: Int, username: String)
  //lots more code
}

person Ido Tamir    schedule 15.05.2019    source источник


Ответы (1)


Вы можете использовать свой собственный SourceCodeGenerator для создания кругового неявного полуавтоматического вывода для каждого класса case.

https://circe.github.io/circe/codecs/semiauto-derivation.html

Код должен выглядеть как...

new slick.codegen.SourceCodeGenerator(model){
  val importCirce =
    "import io.circe.Encoder\nimport io.circe.generic.semiauto._"

  val implicits = model.tables.map(t => {
    val name = entityName(t.name.table)
    s"implicit val ${name}Encoder: Encoder[${name}] = deriveEncoder[${name}]\n"
  }).mkString("\n")

  override def code: String =
    super.code + "\n" + importCirce + "\n\n" + implicits
}

После создания модели у вас уже есть доступный декодер или кодировщик.

import models.Tables._

val user = new User("Peter", 1)
println {
  user.asJson
}

полный пример можно посмотреть здесь https://github.com/jgoday/scala-slick-customcodegen

person jgoday    schedule 23.05.2019
comment
Большое спасибо за ответ. Наконец-то я создал генератор кода, который помещает классы за пределы трейта таблицы. Может быть, я должен также добавить это сейчас. - person Ido Tamir; 23.05.2019