swagger-akka-http 2.x设置响应中的对象列表

时间:2019-09-18 16:10:15

标签: scala akka swagger akka-http swagger-akka-http

我有问题。我想使用Swagger在API响应中发送对象列表。 type =“数组”不适用于我。 我看到了一个主题Set List of Objects in Swagger API response,但这是lib的旧版本。注释已更改。 ApiResponse曾经具有responseContainer参数,但现在不存在了。 我有akka-http个服务器。

val akkaVersion = "2.5.17"
val akkaHttpVersion = "10.1.5"

libraryDependencies ++= Seq(
  "javax.ws.rs" % "javax.ws.rs-api" % "2.0.1",
  "com.github.swagger-akka-http" %% "swagger-akka-http" % "2.0.0",
  "com.github.swagger-akka-http" %% "swagger-scala-module" % "2.0.2",
  "com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
  "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion,
  "com.typesafe.akka" %% "akka-actor" % akkaVersion,
  "com.typesafe.akka" %% "akka-stream" % akkaVersion,
  "com.typesafe.akka" %% "akka-slf4j" % akkaVersion,
  "ch.megard" %% "akka-http-cors" % "0.3.0",
  "org.slf4j" % "slf4j-simple" % "1.7.25"
)

我创建了获取路线,并用招摇注解描述了它。

  @GET
  @Path("offer-statuses/all")
  @Produces(Array("application/json"))
  @Operation(
    tags = Array("offers"),
    summary = "update periods",
    responses = Array(
      new ApiResponse(
        responseCode = "200",
        description = "OfferName response",
        content = Array(
          new Content(schema = new Schema(`type` = "array", implementation = classOf[EnumRow])))
      ),
      new ApiResponse(responseCode = "400",
                      description = "Bad Request",
                      content = Array(new Content(schema = new Schema(implementation = classOf[BadRequest])))),
      new ApiResponse(responseCode = "403",
                      description = "Forbidden",
                      content = Array(new Content(schema = new Schema(implementation = classOf[String]))))
    )
  )
  def allOfferStatuses: Route = {
    path("offers" / "offer-statuses" / "all") {
      get {
        applicationEnumsService.listAllOfferStatuses()
      }
    }
  }

def listAllOfferStatuses(): List[EnumRow]

case class EnumRow(id: Int, name: String)

并构建json:

"/api/v1/offers/offer-statuses/all" : {
      "get" : {
        "tags" : [ "offers" ],
        "summary" : "update periods",
        "operationId" : "allOfferStatuses",
        "responses" : {
          "200" : {
            "description" : "OfferName response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/EnumRow"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/BadRequest"
                }
              }
            }
          },
          "403" : {
            "description" : "Forbidden",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        }
      }
    }
  },

  "EnumRow" : {
    "required" : [ "id", "name" ],
    "type" : "object",
    "properties" : {
      "id" : {
        "type" : "integer",
        "format" : "int32"
      },
      "name" : {
        "type" : "string"
      }
    }
  },

2 个答案:

答案 0 :(得分:0)

我找到了解决方法:

new ArraySchema(schema = new Schema(implementation = classOf[EnumRow]))

答案 1 :(得分:0)

这似乎对我从swagger上传单个文件有用:

import java.io.File

import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.server.Route
import akka.http.scaladsl.server.directives.FileInfo
import com.demo.erp.routes.SwaggerUi.{complete, path, post, storeUploadedFile}
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.media.{Content, Schema}
import io.swagger.v3.oas.annotations.parameters.RequestBody
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.tags.Tag
import javax.ws.rs.core.MediaType
import javax.ws.rs.{Consumes, POST, Path}

@Tag(name = "File Upload")
class FileUploadRouter {

  //just for swagger
  case class FileUpload(@Schema(`type` = "string", format = "binary", description = "file") file: File)

  def tempDestination(fileInfo: FileInfo): File = File.createTempFile(fileInfo.fileName, ".tmp")

  val routes: Route = fileUpload

  @POST
  @Consumes(Array(MediaType.MULTIPART_FORM_DATA))
  @Path("upload")
  @Operation(
    summary = "File upload",
    description = "Upload file",
    requestBody = new RequestBody(
      description = "File",
      content = Array(
        new Content(
          mediaType = MediaType.MULTIPART_FORM_DATA,
          schema = new Schema(implementation = classOf[FileUpload])
        )
      )
    ),
    responses = Array(
      new ApiResponse(
        responseCode = "200",
        description = "File uploaded",
      ),
      new ApiResponse(responseCode = "400", description = "Bad request"),
      new ApiResponse(responseCode = "500", description = "Internal server error")
    )
  )
  def fileUpload: Route = post {
    path("upload") {
      storeUploadedFile("file", tempDestination) {
        case (metadata, file) =>
          // do something with the file and file metadata ...
          println("Metadata: " + metadata)
          println("File: " + file)
          complete(StatusCodes.OK, "Uploaded")
      }
    }
  }
}

具有依赖项:

lazy val akkaHttpVersion = "10.2.1"
lazy val akkaVersion = "2.6.10"
lazy val swaggerVersion = "2.1.5"
lazy val jacksonVersion = "2.11.3"

lazy val root = (project in file("."))
  .enablePlugins(JavaAppPackaging)
  .settings(
    inThisBuild(List(organization := "com.demo.erp", scalaVersion := "2.13.4")),
    name := "demo-erp",
    libraryDependencies ++= Seq(
      "com.typesafe.akka"            %% "akka-http"                 % akkaHttpVersion,
      "com.typesafe.akka"            %% "akka-http-spray-json"      % akkaHttpVersion,
      "com.typesafe.akka"            %% "akka-actor-typed"          % akkaVersion,
      "com.typesafe.akka"            %% "akka-stream"               % akkaVersion,
      "com.typesafe.play"            %% "play-json"                 % "2.9.1",
      "org.mongodb.scala"            %% "mongo-scala-driver"        % "4.1.1",
      "ch.qos.logback"               % "logback-classic"            % "1.2.3",
      "ch.rasc"                      % "bsoncodec"                  % "1.0.1",
      "com.github.pjfanning"         %% "scala-faker"               % "0.5.0",
      "javax.ws.rs"                  % "javax.ws.rs-api"            % "2.1.1",
      "com.github.swagger-akka-http" %% "swagger-akka-http"         % "2.2.0",
      "com.github.swagger-akka-http" %% "swagger-scala-module"      % "2.1.3",
      "com.github.swagger-akka-http" %% "swagger-enumeratum-module" % "2.0.0",
      "com.fasterxml.jackson.module" %% "jackson-module-scala"      % jacksonVersion,
      "pl.iterators"                 %% "kebs-spray-json"           % "1.8.1",
      "io.swagger.core.v3"           % "swagger-core"               % swaggerVersion,
      "io.swagger.core.v3"           % "swagger-annotations"        % swaggerVersion,
      "io.swagger.core.v3"           % "swagger-models"             % swaggerVersion,
      "io.swagger.core.v3"           % "swagger-jaxrs2"             % swaggerVersion,
      "ch.megard"                    %% "akka-http-cors"            % "1.1.0",
      "com.typesafe.akka"            %% "akka-http-testkit"         % akkaHttpVersion % Test,
      "com.typesafe.akka"            %% "akka-actor-testkit-typed"  % akkaVersion % Test,
      "org.scalatest"                %% "scalatest"                 % "3.2.3" % Test
    )
  )