Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enum in swagger

I'm wondering how to document enums in swagger.

According to JavaDoc

The dataType. See the documentation for the supported datatypes. If the data type is a custom object, set it's name, or nothing. In case of an enum use 'string' and allowableValues for the enum constants.

But I didn't find some good Java example how to really use it, specification is here.

Java

First Service

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;     }  } 

Second Service

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;     }  } 

Input

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;  } 

Day

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

Output

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> 

You can see the result here.

There is a lot of problems in HTML output I see (missing Output description, wrong URLs, description is used for notes), but the one I do not know how to overcome is enum usage.

In tests-swagger\target\generated\apidocs\first.json should be (I think)

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

but there is

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

and the $ref is a problem I think...

Any idea?

like image 633
Betlista Avatar asked May 29 '14 14:05

Betlista


People also ask

What is enum in swagger?

You can use the enum keyword to specify possible values of a request parameter or a model property. For example, the sort parameter in GET /items?

What is enum in API?

Enums, or enumerated types, are variable types that have a limited set of possible values. Enums are popular in API design, as they are often seen as a simple way to communicate a limited set of possible values for a given property. However, enums come with some challenges that may limit or impede your API design.

What is enum in JSON?

The enum keyword is used to restrict a value to a fixed set of values. It must be an array with at least one element, where each element is unique.

What is enum variable?

An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it. Common examples include compass directions (values of NORTH, SOUTH, EAST, and WEST) and the days of the week.


1 Answers

In case of swagger-maven-plugin 3.1.0 this might be a minimal documentation:

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

Then this is the generated json model:

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

And this is how the model is presented in the SwaggerUI:

Input { day (string, optional) = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] } 
like image 134
user3078523 Avatar answered Sep 19 '22 11:09

user3078523