Tapir中oneOfVariantFromMatchType隐式参数缺失问题求助
问题解决步骤
1. 修正自定义错误类型定义
你代码中存在语法不一致:定义的FirstError/SecondError是无参case class,但使用时传入了字符串参数。先修正为带参数的定义:
sealed trait Error case class FirstError(msg: String) extends Error case class SecondError(msg: String) extends Error
2. 解决MatchType缺失问题(针对oneOfVariantFromMatchType)
oneOfVariantFromMatchType需要MatchType隐式实例支持,添加对应的自动推导导入即可:
import sttp.model.StatusCode import sttp.tapir._ import sttp.tapir.generic.auto.SchemaDerivation import sttp.tapir.json.circe.TapirJsonCirce import sttp.tapir.typelevel.auto._ // 新增此导入,提供MatchType自动推导能力 import io.circe.generic.auto._ val firstError = oneOfVariantFromMatchType(StatusCode.BadRequest, jsonBody[FirstError].example(FirstError("first error"))) val secondError = oneOfVariantFromMatchType(StatusCode.Unauthorized, jsonBody[SecondError].example(SecondError("second error"))) def errors: EndpointOutput.OneOf[Error, Error] = oneOf(firstError, secondError) endpoint.get.in(...).errorOut(errors)
3. 解决oneOfVariant的类型擦除警告
如果偏好使用oneOfVariant,可以通过**添加判别式(discriminator)**让Tapir通过JSON字段区分变体,而非依赖不可靠的运行时类信息:
import sttp.model.StatusCode import sttp.tapir._ import sttp.tapir.generic.auto.SchemaDerivation import sttp.tapir.json.circe.TapirJsonCirce import io.circe.generic.auto._ sealed trait Error case class FirstError(msg: String) extends Error case class SecondError(msg: String) extends Error // 为密封特质添加判别式,基于"type"字段区分不同错误变体 implicit val errorSchema: Schema[Error] = Schema.derived[Error].withDiscriminator("type") val firstError = oneOfVariant(StatusCode.BadRequest, jsonBody[FirstError].example(FirstError("first error"))) val secondError = oneOfVariant(StatusCode.Unauthorized, jsonBody[SecondError].example(SecondError("second error"))) def errors: EndpointOutput.OneOf[Error, Error] = oneOf(firstError, secondError) endpoint.get.in(...).errorOut(errors)
关键原因说明
MatchType错误:缺少sttp.tapir.typelevel.auto._导入,该包提供MatchType隐式实例的自动推导,是oneOfVariantFromMatchType的必要依赖。- 类型擦除警告:无参case class的运行时类型信息会被JVM擦除,导致Tapir无法可靠区分变体。添加参数+判别式后,Tapir可通过JSON中的明确字段识别具体错误类型,避免依赖不可靠的运行时类检查。
内容的提问来源于stack exchange,提问作者Developus
相关产品推荐
相关产品推荐

