Как создать конечную точку с помощью Tapir в Scala с несколькими схемами

Я просто задаю вопрос, когда пытаюсь создать конечную точку с несколькими формами тел.

Моя модель выглядит так:

      sealed trait FileExampleTrait {
  def kind: String
}

case class FileExampleOne(name: String, length: Int) extends FileExampleTrait {
  override def kind: String = “one”
}

case class FileExampleTwo(name: String) extends FileExampleTrait {
  override def kind: String = “two”
}

case class FileExampleResponse(message: String)

И я пытаюсь создать эту конечную точку:

      val fileExample = baseEndpoint.post
    .in(“example”)
    .in(jsonBody[FileExampleTrait])
    .out(jsonBody[FileExampleResponse])
    .summary(“something”)
    .description(“something”)

Реализация конечной точки выглядит так:

      private val fileExample = toAkkaRoute(jwtConsumer, errorHandler)(
    FileApi.fileExample, { (scope: RequestScope, input: (FileExampleTrait)) =>
      print(scope)
      input match {
        case FileExampleOne(name, _) => Future.successful(FileExampleResponse(name).asRight)
        case FileExampleTwo(name) => Future.successful(FileExampleResponse(name).asRight)
      }
    }
  )

Это просто пример того, что я пытаюсь создать. Я добавил вывод схемы на основе этого:

        val sOne = Schema.derived[FileExampleOne]
  val sTwo = Schema.derived[FileExampleTwo]
  implicit val sExampleTrait: Schema[FileExampleTrait] =
    Schema.oneOfUsingField[FileExampleTrait, String](_.kind, _.toString)(“one” -> sOne, “two” -> sTwo)

Я создал тест для проверки конечной точки на основе Akka HTTP:

         test(“Example test”) {
    new Fixture() {
      val request = FileExampleOne(“name”, 1)
      Post(s”/api/v1/files/example”, jsonEntity(request)).withHeaders(requestHeaders) ~> wrappedRoute ~> check {
        response should be(successful)
        contentType shouldEqual ContentTypes.`application/json`
      }
    }
  }

Ошибка, которую я получаю, следующая:

      Response error: {“code”:400,“message”:“Invalid value for: body (No constructor for type FileExampleTrait, JObject(List((name,JString(name)), (length,JInt(1)))))“}

Я следил за этой документацией.

0 ответов

Другие вопросы по тегам