2014-02-18 3 views
13

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

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 и Сваггер понять?

ответ

1

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

0

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

+0

Я бы использовали последние версии swagger-play2 и swagger-ui, которые были доступны в феврале. С этого момента это было исправлено или, как вы думаете, это должно было сработать тогда? –

+0

Только что подтверждено в 1.3.8. Не могли бы вы повторить попытку? – fehguy

+1

Я до сих пор не могу сделать параметр запроса необязательным, используя тип Option Scala в 1.3.8. Все еще получаю «НЕИЗВЕСТНЫЙ ТИП: scala.Option» на консоли. В выводе json для параметра вместо свойства «type» он выводит свойство «items», которое, по-видимому, прерывает swagger-ui. "items": {"type": "string"} –

1

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

0

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

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

0

Временное решение APIImplicitParam не работало для меня.

Другим решением является опустим вариант параметров из маршрутов

GET /documents controllers.DocumentController.getDocuments() 

Но захватить его в коде:

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

и аннотацию с ApiImplicitParam для чванства документы

Смежные вопросы