自动 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
我使用 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