автоматическое кодирование / декодирование JSON с помощью созданных классов корпусов Slick-Codegen - PullRequest
0 голосов
/ 15 мая 2019

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

circe:

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>

Код, созданный с помощью скользкого кода, выглядит следующим образом:

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
}

1 Ответ

1 голос
/ 23 мая 2019

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

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

...