Подтвердить что ты не робот

Необязательные параметры с Play 2 и Swagger

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

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

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

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

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

4b9b3361

Ответ 1

Обходным решением, которое я нашел до сих пор, является удаление параметра из списка параметров, использование аннотации Swagger @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
}

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

Ответ 2

Я работал так же, как и с ответом @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)

Я зарегистрировал Issue 706 против Swagger тоже.

Ответ 3

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

Ответ 4

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

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

Ответ 5

Обходной путь 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