You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:10:41