自动 JSON encoding/decoding with slick-codegen created case 类

automatic JSON encoding/decoding with slick-codegen created case classes

我使用 slick-codegen 从数据库生成了我的 Scala 模型。 现在 Json 映射器的生成失败了。我怎样才能避免手工做所有事情?

圈子:

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

播放-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
}

您可以使用您自己的 SourceCodeGenerator 来创建 circe 隐式 semi-automatic 推导 对于每个案例 class.

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