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

如何配置Tapir移除Schema生成类名中的OpenAPI前缀?

Tapir 能否全局配置类名转换(类似Circe的transformConstructorNames)

JSON库Circe提供了transformConstructorNames: String => String配置参数,可批量转换类名称。Tapir有没有类似的全局配置功能?

我使用Schema.derived[OpenAPISealedTrait]生成Schema的效果很好,但希望移除整个类层级中所有类名里的“OpenAPI”前缀。例如我有以下代码:

sealed trait OpenAPIShape
case class OpenAPISquare(size: Int) extends OpenAPIShape
case class OpenAPICircle(radius: Int) extends OpenAPIShape

我想通过某种配置调用Schema.derived[OpenAPIShape],让生成的Schema标题/名称自动去掉“OpenAPI”,最终YAML中的名称显示为Square、Circle和Shape。请问这是否可行?能不能不用为层级中的每个类单独编写Schema.derived?


更新1

感谢@adamw的解答,我按照理解编写了以下代码,但Swagger UI中仍然显示OpenAPIShape等原类名:

implicit val sShape: Schema[OpenAPIShape] = {
  implicit val config: Configuration = Configuration.default
    .copy(
      toDiscriminatorValue = { name =>
        val replacement = name.fullName.split('.').last.stripSuffix("$").replaceAll("OpenAPI", "")
        replacement
      }
    )
  Schema.derived
}

注意Schema.derived的定义为def derived[T]: Schema[T] = macro Magnolia.gen[T],它并不接受隐式的Configuration参数,可能我忽略了某些宏相关的机制?


更新2

再次感谢@adamw,以下两种方法均可正常实现需求:

方法一:手动修改每个类的Schema名称

import sttp.tapir._
import sttp.tapir.generic.auto._
import sttp.tapir.generic.Derived

private implicit val sCircle: Schema[OpenAPICircle] =
  implicitly[Derived[Schema[OpenAPICircle]]].value.copy(name = Some(SName("Circle")))
private implicit val sSquare: Schema[OpenAPISquare] =
  implicitly[Derived[Schema[OpenAPISquare]]].value.copy(name = Some(SName("Square")))
private implicit val sShape: Schema[OpenAPIShape] =
  implicitly[Derived[Schema[OpenAPIShape]]].value.copy(name = Some(SName("Shape")))

方法二:使用注解指定编码名称

@encodedName("Shape")
sealed trait OpenAPIShape
@encodedName("Square")
case class OpenAPISquare(sizeInt: Int) extends OpenAPIShape
@encodedName("Circle")
case class OpenAPICircle(radiusInt: Int) extends OpenAPIShape

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:47