Scala, Circe, Http4s - есть ли способ кодировать Throwable в Circe? - PullRequest
1 голос
/ 16 января 2020

Я создал иерархию ошибок:

sealed trait MyError extends Throwable
final case class SecondError(msg: String) extends MyError

Теперь я могу получить такую ​​ошибку в моих http4s маршрутах:

case GET -> Root / "things" => for {
        response <- things.all.foldM(
          error => error match {
            case SecondError(_) => InternalServerError(error)            
          }
...

Но я получаю скомпилированную ошибку:

could not find implicit value for parameter encoder: io.circe.Encoder[Throwable]

Можно ли кодировать Throwable с помощью circe и http4s? Я пытался сделать это так:

implicit def encoderHttpThrowable: EntityEncoder[Env, Throwable] = jsonEncoderOf[Env, Throwable]

Но это не решило проблему.

1 Ответ

1 голос
/ 16 января 2020

Невозможно автоматически кодировать Java Иерархию с Circe (или любой другой библиотекой) (я почти уверен в этом).

Итак, у вас есть 3 возможности:

  1. Просто используйте сообщение об ошибке:

    case GET -> Root / "things"  =>
        things.all.foldM (
          error => InternalServerError(error.getMessage()),
          Ok(_)
        )
    
  2. Или избавьтесь от Throwable:

      sealed trait MyError
      final case class SecondError(msg: String) extends MyError
    

    И теперь вы можете закодировать ошибку

    ...
    case GET -> Root / "things"  =>
      things.all.foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    
  3. Сопоставить ваш Throwable с вашей собственной ошибкой (Sealed Trait без Throwable):

    ...
    case GET -> Root / "things"  =>
      things.all
        .mapError{
          case ex: IllegalArgumentException => SecondError(ex.getMessage)
          case ex => FirstError(ex.getMessage)
       }
        .foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    
...