【问题标题】:Implicitly getting Schema from class with type Alias从别名类型的类中隐式获取 Schema
【发布时间】:2021-10-12 10:01:47
【问题描述】:

我目前正在使用 sttp 版本 3.3.14tapir 版本 0.18.0-M15,并且我在某些案例类的架构方面遇到了问题。更具体地说,包含类型别名的案例类。

这是一个简单的自定义编解码器:

import cats.implicits._
import io.circe.syntax._
import io.circe.{Codec, Decoder, Encoder}
import sttp.tapir.Schema
import io.circe.generic.semiauto._
import sttp.tapir.generic.auto._

object codecs {
  private def eitherDecoder[A, B](implicit a: Decoder[A], b: Decoder[B]): Decoder[Either[A, B]] = a.map(_.asLeft[B]) or b.map(_.asRight[A])
  private def eitherEncoder[A, B](implicit a: Encoder[A], b: Encoder[B]): Encoder[Either[A, B]] =
    Encoder.instance(_.fold(_.asJson, _.asJson))
  implicit def eitherCodec[A, B](implicit aE: Encoder[A], bE: Encoder[B], a: Decoder[A], b: Decoder[B]): Codec[Either[A, B]] =
    Codec.from(eitherDecoder, eitherEncoder)
}

以下代码可以正常工作:

object SuccessCase extends App {

  import codecs.eitherCodec

  case class Cls(i: Either[String, Int])

  implicit val codec: Codec[Cls] = deriveCodec[Cls]

  val schema = implicitly[Schema[Cls]]
}

但是这个测试用例失败了。请注意,唯一的区别是 Either 别名。

object FailureCase extends App {

  import codecs.eitherCodec

  type EitherAlias = Either[String, Int]
  case class Cls(i: EitherAlias)

  implicit val codec: Codec[Cls] = deriveCodec[Cls]

  val schema = implicitly[Schema[Cls]]

  //Fails with error:
  //  Could not find Schema for type com.xxx.FailureCase.Cls.
  //  Since 0.17.0 automatic derivation requires the following import: `import sttp.tapir.generic.auto._`
  //  You can find more details in the docs: https://tapir.softwaremill.com/en/latest/endpoint/customtypes.html#schema-derivation
  //  When using datatypes integration remember to import respective schemas/codecs as described in https://tapir.softwaremill.com/en/latest/endpoint/integrations.html
  //  val schema = implicitly[Schema[Cls]]

  //  (sttp.tapir.generic.auto._ is imported)
}

您知道这里可能出了什么问题或如何解决吗?

谢谢!

【问题讨论】:

    标签: scala sttp tapir magnolia-scala


    【解决方案1】:

    使用的是貘版本0.18.0-M15。问题似乎已经在0.19版本中解决了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多