Scala cats - проблема с кодировкой / декодированием jsons - PullRequest
1 голос
/ 20 апреля 2019

Я создал простые маршруты:

class MyRoutes[F[_] : Async](service: MyService[F]) extends Http4sDsl[F] {

  def routes: HttpRoutes[F] = HttpRoutes.of[F] {
    case req@PUT -> Root / "bets" =>
      for {
        bet <- req.as[Bet]
        created <- service.put(bet)
        response <- Created(created)
      } yield response
}

и jsons implicits для ввода и вывода:

object jsons {
  implicit def circeDecoder[A[_] : Sync, B: Decoder]: EntityDecoder[A, B] = jsonOf[A, B]
  implicit def circeEncoder[A[_] : Sync, B: Encoder]: EntityEncoder[A, B] = jsonEncoderOf[A, B]
}

Но когда я запустил эту программу через Почтальон, я получил ошибку: The request body was invalid. с 422 кодом ошибки. Я думаю, что-то не так с кодировщиком и декодером json, потому что мой запрос был очень простым и понятным:

{       
    "stake": 434,
    "name": "Something"
}

Я пытался добавить неявный декодер в маршруты:

 implicit val betDecoder: EntityDecoder[F, Bet] = jsonOf[F, Bet]

но это тоже не помогло. Может ли кто-нибудь помочь мне с этим и рассказать, как создать хороший кодер и декодер для jsons? Я использую библиотеку circe для разбора.

1 Ответ

1 голос
/ 20 апреля 2019

ОК, тупой, я решил проблему. У меня было (вероятно) неправильное определение Bet. Было:

case class Bet(betId: BetId, stake: BigDecimal, name: String)

case class BetId(betId: String) extends AnyVal

Так что я должен дать Id в качестве параметра. Я изменил код на этот:

case class Bet(betId: Option[BetId], stake: BigDecimal, name: String)

case class BetId(betId: String) extends AnyVal

и после этого все работает правильно. Другой вопрос - это хорошая практика или это может быть сделано лучше?

...