scala - 从别名类型的类中隐式获取 Schema
问题描述
我目前正在使用sttp 版本 3.3.14和貘版本 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)
}
关于这里可能有什么问题或如何解决这个问题的任何想法?
谢谢!
解决方案
正在使用貘版本0.18.0-M15
。问题似乎已经在版本中解决了0.19
推荐阅读
- python - 使用 Selenium 和 Python 在网页的特定列中搜索文本
- ms-access - 如何修复 MS-Access 中的错误代码 2001?
- c# - 如何组合多个 Func
在 C# 的 for 循环中动态地 - javascript - 如何在初始构建期间为 webpack-dev-server 设置占位符?
- elasticsearch - 从 Painless 脚本执行 OS 命令
- ssl - Curl 说证书已过期 (10) 但过期日期在未来
- android - 我如何获得以前 Fragment android kotlin 的名称?
- flutter - 'owner!._debugCurrentBuildTarget == this': 不正确
- tags - 哪个 API 端点将允许我通过 Slack @tag 查找用户信息
- python - Conda 为所有安装/更新命令返回“发现彼此不兼容的以下规范”