Дополнительные параметры с Play 2 и Swagger

Я пытаюсь использовать Swagger для документирования API Play 2 REST, но swagger-play2 кажется, не понимают необязательные параметры, определенные с помощью Scala Option type - обычный способ сделать необязательный параметр в Play 2:

GET /documents controllers.DocumentController.getDocuments(q: Option[String])

Я хочу q параметр должен быть необязательным. Существует соответствующий метод аннотированного контроллера с этим Option[String] пары. При запуске я получаю UNKOWN TYPE в журнале и JSON, созданный перерывы API-документы swagger-ui:

UNKNOWN TYPE: scala.Option
[info] play - Application started (Dev)

Есть ли другой способ указать необязательный параметр в Play 2, и Swagger понимает это?

5 ответов

Один обходной путь, который я нашел до сих пор, состоит в том, чтобы удалить параметр из списка параметров, используя Swagger's. @ApiImplicitParams аннотации и захватить параметр из объекта запроса в вашем методе контроллера. Swagger будет считать параметр необязательным.

GET /documents controllers.DocumentController.getDocuments()

а затем в контроллере:

@ApiOperation(...)
@ApiImplicitParams(Array(
  new ApiImplicitParam(name = "q", value = "Query", required = false, dataType = "string", paramType = "query"),
))
def getDocuments = Action { implicit request => 
  // use param via request object
}

Это, конечно, не так хорошо, как использование типа Option в Scala, но дает правильные документы Swagger.

Я работал над этим аналогично ответу @Tom Wadley.

Этот код создает проблему:

@ApiOperation( ... )
def foo(@ApiParam(value="Argument 1") @PathParam("a1") a1 : Option[Int]) = ...

Чтобы избежать этой проблемы, просто удалите аннотации из аргумента и вместо этого объявите неявный параметр с тем же именем:

@ApiOperation( ... )
@ApiImplicitParams(Array(new ApiImplicitParam(name="a1", dataType="Int", required=false, paramType="query", ...)
def foo(a1 : Option[Int]) = ...

(Scala 2.11.2, Play 2.3, Swagger 1.3.8)

Я зарегистрировал Выпуск 706 против Swagger тоже.

Какую версию Swagger вы используете? Это должно быть поддержано.

Обходной путь APIImplicitParam не работал для меня.

Другой обходной путь - опустить параметр param из маршрутов.

GET /documents controllers.DocumentController.getDocuments()

Но возьмите это в коде:

val qSeq = request.queryString.get("q")
val q = qSeq match {
  case None => None
  case Some(seq) => seq.headOption
}

и аннотировать его с помощью ApiImplicitParam для документов Swagger

В качестве альтернативы вы можете использовать эту библиотеку https://github.com/iheartradio/play-swagger

Эта библиотека использует иной подход, чем аннотация (которая заставляет вас изучать новый API), вы записываете спецификации swagger непосредственно в файл маршрутов в виде комментариев. Он автоматически генерирует определение параметров на основе файла маршрутов и для параметров, введенных в Option[T], автоматически помечает их как обязательные =false.

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