【问题标题】:Circe,Tapir and JodaTimeCirce、Tapir 和 JodaTime
【发布时间】:2020-09-22 04:06:05
【问题描述】:

我有一个类似的案例类

final case class MyClass(id: Long, eventData: EventsDTO)

final case class EventsDTO(
    customerId: Long,
    eventName: String,
    processTime: DateTime //JodaTime
)

我有自定义编码器和解码器

val dateFormatter = DateTimeFormat.forPattern("yyyyMMdd")
    implicit def TimestampFormat: Encoder[DateTime] with Decoder[DateTime] =
      new Encoder[DateTime] with Decoder[DateTime] {
        override def apply(a: DateTime): Json = Encoder.encodeString.apply(a.toString)

        override def apply(c: HCursor): Result[DateTime] =
          Decoder.decodeString.map(s => DateTime.parse(s, dateFormatter)).apply(c)
      }

我的貘端点为

 val inclusive: Route[Unit, MyClass] =
      endpoint.post
        .in(Paths.api)
        .out(jsonBody[WidgetsResponse])

但是如果运行上面的代码我会得到

Error:(71, 15) Cannot find a codec for type: com.Model.MyClass, formatted as: sttp.tapir.CodecFormat.Json.
Did you define a codec for: com.Model.MyClass?
Did you import the codecs for: sttp.tapir.CodecFormat.Json?
Is there an implicit schema for: com.Model.MyClass, and all of its components?
(codecs are looked up as implicit values of type Codec[com.Model.MyClass, sttp.tapir.CodecFormat.Json, _];
schemas are looked up as implicit values of type Schema[com.Model.MyClass])
      jsonBody[MyClass]


Error:(71, 15) not enough arguments for method jsonBody: (implicit codec: sttp.tapir.CodecForOptional[com.Model.MyClass, sttp.tapir.CodecFormat.Json, _])sttp.tapir.EndpointIO.Body[com.Model.MyClass, sttp.tapir.CodecFormat.Json, _].
Unspecified value parameter codec.
      jsonBody[MyClass]

有人可以帮我做错什么吗?

如果我从 EventsDTO 中删除 processTime: DateTime //JodaTime ,应用程序运行正常。

【问题讨论】:

  • 有什么理由使用 JodaTime 而不是 Java.time 包?
  • @LuisMiguelMejíaSuárez 它是一个旧应用程序,我们需要使用 JodaTime。肯定不能改变。
  • @LuisMiguelMejíaSuárez 这就是我要问的。我已经提供了编码器和解码器。我上面的代码中有隐含。但它不起作用。
  • 哦,对了,对不起,我错过了那部分。你确定这些隐含在范围内吗?另外,您是否尝试过首先导出 circe 解码器而不是 tapir 解码器?
  • @LuisMiguelMejíaSuárez 是的,这些是 circe 解码器/编码器,是的,它们在范围内

标签: scala jodatime decoder circe tapir


【解决方案1】:

这是丢失的部分

  implicit val schemaForDateTime: Schema[DateTime] = Schema(SString)

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2021-06-22
    • 2013-01-26
    • 1970-01-01
    • 2016-06-06
    • 2019-03-07
    • 1970-01-01
    • 2018-05-08
    • 2017-06-23
    相关资源
    最近更新 更多