Я создал иерархию ошибок:
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
с помощью http4s
и http4s
? Я пытался сделать это так:
implicit def encoderHttpThrowable: EntityEncoder[Env, Throwable] = jsonEncoderOf[Env, Throwable]
Но это не решило проблему.
Всего 1 ответ
Невозможно автоматически кодировать иерархию Java с помощью Circe (или любой другой библиотеки) (я в этом совершенно уверен).
Итак, у вас есть 3 возможности:
Просто используйте сообщение об ошибке:
case GET -> Root / "things" =>
things.all.foldM (
error => InternalServerError(error.getMessage()),
Ok(_)
)
Или избавиться от Throwable:
sealed trait MyError
final case class SecondError(msg: String) extends MyError
И теперь вы можете закодировать ошибку
...
case GET -> Root / "things" =>
things.all.foldM (
error => InternalServerError(error),
Ok(_)
)
Сопоставьте свой Throwable с собственной ошибкой (Запечатанная черта без Throwable):
...
case GET -> Root / "things" =>
things.all
.mapError{
case ex: IllegalArgumentException => SecondError(ex.getMessage)
case ex => FirstError(ex.getMessage)
}
.foldM (
error => InternalServerError(error),
Ok(_)
)