首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tapir自定义编码c

Tapir自定义编码c
EN

Stack Overflow用户
提问于 2020-03-16 16:20:13
回答 1查看 629关注 0票数 3

我被困在一个地方,我用的是scala,tapir和circe。

代码语言:javascript
复制
sealed abstract class S1Error extends Product with Serializable
object S1Error {
  final case class SError(error: SMError) extends S1Error
}
sealed abstract class SMError(message: String)
object SMError {
  final case class SVError(message: String) extends SMError(message)
}

对于tapir errorOut,我使用以下方法

代码语言:javascript
复制
val schemaVersionError: EndpointOutput.StatusMapping[SError] = statusMappingValueMatcher(
      StatusCode.BadRequest,
      jsonBody[SError]
        .description("XXXX.")
    ) {
      case SMError(SVError(_)) => true
      case _                                  => false
    }

由于这种结构,我得到的API结果是

代码语言:javascript
复制
{
    "error": {
        "SVError": {
            "message": "XXXXG"
        }
    }
}

在理想的情况下,我想要一个回应

代码语言:javascript
复制
"message": "XXXXG"

我不能更改错误结构。是否有一种方法来包装此错误使用自定义编解码器,以获得所需的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-16 19:38:13

Tapir编解码器是从Circe的译码器和编码器中导出的。

您看到的是circe编码case类的默认方法。

Circe提供了用deriveUnwrappedEncoder马戏团-普通-临时演员对case类进行编码的可能性。不幸的是,它没有为SMError编译(可能派生机制会被抽象类层次结构混淆)。

您可以做的就是手动创建编码器:

代码语言:javascript
复制
sealed abstract class S1Error extends Product with Serializable

object S1Error {
  final case class SError(error: SMError) extends S1Error

  implicit val encoder: Encoder[SError] = Encoder[SMError].contramap(_.error)
  // or you can use deriveUnwrappedEncoder from circe-generic-extras:
  // implicit val encoder: Encoder[SError] = deriveUnwrappedEncoder
}

//I also needed to make message a field in SMError
sealed abstract class SMError(val message: String)
object SMError {
  final case class SVError(override val message: String) extends SMError(message)

  implicit val encoder: Encoder[SMError] = Encoder.encodeJsonObject.contramap{s => JsonObject("message" -> s.message.asJson)}
}

现在的答复如下:

代码语言:javascript
复制
{
    message": "XXXXG"
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60709580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档