我有以下端点:
val myEndpoint: PublicEndpoint[Unit, ErrorResponse, Entity, Any] = endpoint.get
.in("test")
.out(jsonBody[Entity])
.errorOut(jsonBody[ErrorResponse])
字符串
其中Entity
和ErrorResponse
是:
sealed trait ErrorResponse
object ErrorResponse {
final case class NotFound(id: String) extends ErrorResponse
final case class UnknownError(error: String) extends ErrorResponse
implicit val notFoundSchema: Schema[NotFound] = Schema.derived
implicit val unknownErrorSchema: Schema[UnknownError] = Schema.derived
implicit val errorResponseSchema: Schema[ErrorResponse] = Schema.derived
}
型
然后我将端点转换为akka路由:
val myEndpointRoute: Route = AkkaHttpServerInterpreter().toRoute(myEndpoint.serverLogic { _ =>
val result: Either[ErrorResponse, Entity] = Right(Entity("some data of the entity"))
Future.successful(result)
})
val swaggerEndpoint = SwaggerInterpreter().fromEndpoints[Future](List(myEndpoint), "Tapir Demo", "1.0")
val swaggerRoutes: Route = AkkaHttpServerInterpreter().toRoute(swaggerEndpoint)
型
然后运行服务器:
Http()
.newServerAt("localhost", 8080)
.bind(myEndpointRoute ~ swaggerRoutes)
.onComplete {
case Success(_) =>
println(s"Started on port 8080")
case Failure(e) =>
println("Failed to start ... ", e)
}
型
我遇到的问题是,当浏览ErrorResponse
的模式时,我看到的是对象的层次结构(#0
和#1
),而不是像NotFound
,UnknownError
这样的子类型。
的数据
我应该如何定义ErrorResponse
的模式?
PS:dependencies:
"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.9.6",
"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.9.6"
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.9.6",
"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.9.6"
型
1条答案
按热度按时间nxagd54h1#
这就是swagger UI在OpenAPI Spec 3.1.0中渲染oneOf的方式,OpenAPI Spec 3.1.0是tapir使用的默认版本。如果您将其更改为OpenAPI Spec 3.0.3或任何3.x.x,您将获得预期的结果。这里您有一个重现您的案例的POC(我使用pekko-http而不是akka-http,但它是相同的)
*build.sbt
字符串
*Main.scala
型
使用
sbt run
启动服务器后,可以检查端点是否符合OpenAPI Spec3.1.0
和3.0.3
Swagger中报告了一个similar issue。建议添加与对象同名的属性title。
对于tapir 1.9.6(您正在使用的版本,也是目前发布的最新版本),您可以将定义的模式更改为以下内容,
型
这样做,将产生您正在寻找的结果(带有数字的哈希仍然存在,但现在它也添加了您想要的描述)
的