QueryParam объявлен как необязательный в Swagger API - PullRequest
0 голосов
/ 07 сентября 2018

Я реализовал ресурс Jax-RS (используя Dropwizard), который содержит этот метод:

import javax.ws.rs.DefaultValue;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.QueryParam;
import org.hibernate.validator.constraints.NotEmpty;
[...]

@POST
@Timed
public Prediction predict(
        @QueryParam("content") @NotEmpty String content,
        @HeaderParam("outputProbability") @DefaultValue("false") Boolean outputProbability) {
    return outputProbability ? getPredictionWithProb(content) : getPrediction(content);
}

В моем pom.xml я добавил swagger-maven-plugin вот так:

        <plugin>
            <groupId>com.github.kongchen</groupId>
            <artifactId>swagger-maven-plugin</artifactId>
            <version>${swagger-maven-plugin-version}</version>
            <configuration>
                <apiSources>
                    <apiSource>
                        <springmvc>false</springmvc>
                        <schemes>
                            <scheme>http</scheme>
                        </schemes>
                        <locations>[...]</locations>
                        <info>[...]</info>
                        <swaggerDirectory>src/main/resources/swagger</swaggerDirectory>
                    </apiSource>
                </apiSources>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Когда я запускаю mvn compile, он создает файл swagger.json, содержащий следующие записи:

"paths" : {
"/predict" : {
  "post" : {
    "operationId" : "predict",
    "produces" : [ "application/json" ],
    "parameters" : [ {
      "name" : "content",
      "in" : "query",
      "required" : false,
      "type" : "string"
    }, {
      "name" : "outputProbability",
      "in" : "header",
      "required" : false,
      "type" : "boolean",
      "default" : false
    } ],
[...]

Все нормально, кроме одной строки в определении параметра content:

      "required" : false,

Однако поле content явно является обязательным. Это также подтверждается при вызове службы: если параметр content не указан, выдается ошибка.

Из этого ответа кажется, что я мог бы явно указать, что параметр требуется, используя аннотацию Swagger @ ApiParam . Однако я бы предпочел не вводить дополнительный код и зависимости только для целей определения API Swagger.

Это выглядит как незначительная проблема, но это может указывать на ошибку в моем коде или даже в swagger-maven-plugin. Я что-то пропустил?

Плагин Swagger не распознает аннотацию @org.hibernate.validator.constraints.NotEmpty? Если это не так, является ли параметр Swagger @OpenAPI единственным способом объявить параметр, требуемый для плагина Swagger?

1 Ответ

0 голосов
/ 07 сентября 2018

Единственное рабочее решение, которое я нашел, - это действительно использовать аннотацию @ApiParam, например:

import io.swagger.annotations.ApiParam;
[...]


@POST
@Timed
public Prediction predict(
        @QueryParam("content") @NotEmpty @ApiParam(required = true) String content,
        @HeaderParam("outputProbability") @DefaultValue("false") Boolean outputProbability) {

Конечно, для этого требуется дополнительная зависимость Swagger (в pom.xml):

    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>1.5.21</version>
    </dependency>
...