Не удалось найти или построить Param [shapeless. :: [String, shapeless. :: [io.circe. Json, shapeless.HNil]]] - PullRequest
1 голос
/ 07 августа 2020

Я работаю над базовым c приложением для работы на доске для практики, и при попытке скомпилировать свой Scala код я получаю следующую ошибку. метод ниже

  def insert(jobPost: JobPost): doobie.Update0 = {
    sql"""
         |INSERT INTO jobs (
         |  id,
         |  details
         |)
         |VALUES (
         |  ${jobPost.id},
         |  ${jobPost.details}
         |)
        """.stripMargin
      .update
  }

Я просмотрел здесь документы: https://tpolecat.github.io/doobie-0.2.3/15-FAQ.html, но не смог понять это.

Для дополнительных info Я включу следующее:

case class JobPost(id: String, details: JobPostDetails)

case class JobPostDetails(title: String, description: String, salary: Double, employmentType: String, employer: String)
    def createTable: doobie.Update0 = {
      sql"""
           |CREATE TABLE IF NOT EXISTS jobs (
           |  id UUID PRIMARY KEY,
           |  details JSON NOT NULL
           |)
       """.stripMargin
        .update
    }

1 Ответ

1 голос
/ 07 августа 2020

В вашем случае Doob ie не знает, как сериализовать JobPostDetails в столбец JSON в вашей базе данных Postgres.

По умолчанию Doob ie не знает как изменить класс case на JSON. Возможно, самая популярная библиотека для сериализации JSON в scala - это circe. Вам нужно будет добавить дополнительные зависимости в ваш build.sbt для интеграции circe и circe- Postgres -doob ie.

"org.tpolecat" %% "doobie-postgres" % "0.8.8"
"org.tpolecat" %% "doobie-postgres-circe" % "0.8.8"
"io.circe" %% "circe-core" % "0.13.0"

Затем вы должны создать экземпляры Encoder, Decoder , Put и Get классы типов в сопутствующем объекте JobPostDetails:

import io.circe.{ Decoder, Encoder }
import io.circe.generic.semiauto.{ deriveDecoder, deriveEncoder }
import doobie.postgres.circe.json.implicits._
import doobie._
import io.circe.syntax._

case class JobPostDetails(title: String, description: String, salary: Double, employmentType: String, employer: String)

object JobPostDetails {

  //for decoding json into JobPostDetails
  implicit val circeDecoder: Decoder[JobPostDetails] =
    deriveDecoder[JobPostDetails]

  //for encoding JobPostDetails into json
  implicit val circeEncoder: Encoder[JobPostDetails] =
    deriveEncoder[JobPostDetails]

  //tells doobie to put JobPostDetails as json to details column
  implicit val put: Put[JobPostDetails] =
    Put[Json].contramap(_.asJson) 

  //tells doobie how to read JobPostDetails from json column
  implicit val get: Get[JobPostDetails] =
    Get[Json].temap(_.as[JobPostDetails].leftMap(_.show)) 
}

После этого вы сможете сохранить JobPost.

...