如何配置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
相关产品推荐
相关产品推荐

