plugin example cli java swagger swagger-maven-plugin

java - example - swagger-codegen-maven-plugin



Enumerar en jactancia (5)

En el caso de swagger-maven-plugin 3.1.0, esta podría ser una documentación mínima:

@ApiModel public class Input { @ApiModelProperty public Day day; } @ApiModel public enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday; }

Entonces este es el modelo json generado:

"definitions" : { "Input" : { "type" : "object", "properties" : { "day" : { "type" : "string", "enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] } } } }

Y así es como se presenta el modelo en SwaggerUI:

Input { day (string, optional) = [''Monday'', ''Tuesday'', ''Wednesday'', ''Thursday'', ''Friday'', ''Saturday'', ''Sunday''] }

Me pregunto cómo documentar enumeraciones en swagger.

Según JavaDoc

El tipo de datos. Consulte la documentación para los tipos de datos soportados. Si el tipo de datos es un objeto personalizado, defina su nombre o nada. En el caso de una enumeración, use ''string'' y allowableValues ​​para las constantes enum.

Pero no encontré un buen ejemplo de Java sobre cómo usarlo realmente, la especificación está here .

Java

Primer servicio

package betlista.tests.swagger; import betlista.tests.swagger.model.Input; import betlista.tests.swagger.model.Output; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiOperation; @Api(value = "first", position = 1) public class RestServiceFirst { @ApiOperation(value = "foo1 operation", httpMethod = "POST", position = 1, nickname = "foo") public void foo1(Input input) { } @ApiOperation(value = "bar1 operation", response = Output.class, httpMethod = "GET", position = 2, nickname = "bar") public Output bar1() { return null; } }

Segundo servicio

package betlista.tests.swagger; import betlista.tests.swagger.model.Input; import betlista.tests.swagger.model.Output; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiOperation; @Api(value = "second", position = 2) public class RestServiceSecond { @ApiOperation(value = "foo2 operation", httpMethod = "POST", position = 1) public void foo2(Input input) { } @ApiOperation(value = "bar2 operation", response = Output.class, httpMethod = "GET", position = 2) public Output bar2() { return null; } }

Entrada

package betlista.tests.swagger.model; import com.wordnik.swagger.annotations.ApiModel; import com.wordnik.swagger.annotations.ApiModelProperty; @ApiModel public class Input { @ApiModelProperty(dataType = "string", allowableValues = "M, T", value = "description", notes = "notes") public Day day; }

Día

package betlista.tests.swagger.model; public enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday; }

Salida

package betlista.tests.swagger.model; import com.wordnik.swagger.annotations.ApiModel; @ApiModel(value = "Output") public class Output { @ApiModelProperty String field; }

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>betlista</groupId> <artifactId>tests-swagger</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!-- generate REST documentation --> <dependency> <groupId>com.wordnik</groupId> <artifactId>swagger-jaxrs_2.10</artifactId> <version>1.3.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.github.kongchen</groupId> <artifactId>swagger-maven-plugin</artifactId> <version>2.0</version> <configuration> <apiSources> <apiSource> <locations>betlista.tests.swagger;betlista.tests.swagger.model</locations> <apiVersion>1.0.0</apiVersion> <basePath>http://localhost:port/rest</basePath> <outputTemplate>${basedir}/strapdown.html.mustache</outputTemplate> <outputPath>${basedir}/target/generated/strapdown.html</outputPath> <swaggerDirectory>${basedir}/target/generated/apidocs</swaggerDirectory> <useOutputFlatStructure>false</useOutputFlatStructure> </apiSource> </apiSources> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

Puedes ver el resultado here .

Hay muchos problemas en la salida HTML que veo (falta la descripción de la salida, las URL incorrectas, la descripción se usa para las notas), pero la que no sé cómo superar es el uso de la enumeración.

En tests-swagger/target/generated/apidocs/first.json debería ser (creo)

"models" : { "Input" : { "id" : "Input", "description" : "", "properties" : { "day" : { "type" : "string", "enum" : [ "M", " T" ] } } } }

pero hay

"models" : { "Input" : { "id" : "Input", "description" : "", "properties" : { "day" : { "$ref" : "Day", "enum" : [ "M", " T" ] } } } }

y el $ref es un problema, creo ...

¿Alguna idea?


Gracias por esta ayuda.

He usado este tipo en mi código.

private String date; @ApiModelProperty(dataType = "string", allowableValues = "FirstValue, SecondValue", value = "description", notes = "notes") private CarrierType carrierName; public enum CarrierType { FirstValue, SecondValue }

Está funcionando bien para mí.


Puede usar responseContainer con su anotación @ApiOperation:

@ApiOperation(value = "Brief description of your operation.", response = YourEnum.class, responseContainer = "List")


Según el documento que señalaba:

El tipo de datos. Consulte la documentación para los tipos de datos soportados. Si el tipo de datos es un objeto personalizado, defina su nombre o nada. En el caso de una enumeración, use ''string'' y allowableValues ​​para las constantes enum.

Creo que deberías agregar los valores de enumeración manualmente:

@ApiModel public class Input { @ApiModelProperty(dataType = "string", allowableValues = "Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday", value = "description", notes = "notes") public Day day; }


Solución personalizada del complemento de Springfox:

swagger.io recomienda: "Si necesita especificar descripciones para elementos de enumeración, puede hacerlo en la descripción del parámetro o propiedad"

Implementé esta recomendación basada en una anotación propietaria de @ApiEnum . La biblioteca está disponible aquí: https://github.com/hoereth/springfox-enum-plugin