Skip to content

Commit 0f037d8

Browse files
committed
Spring OAS 3.x support
1 parent 409369b commit 0f037d8

25 files changed

+262
-35
lines changed

src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation
7777
protected boolean useOptional = false;
7878
protected boolean openFeign = false;
7979
protected boolean defaultInterfaces = true;
80-
protected String springBootVersion = "1.5.22.RELEASE";
80+
protected String springBootVersion = "2.1.16.RELEASE";
8181
protected boolean throwsException = false;
8282
private boolean notNullJacksonAnnotation = false;
8383

@@ -161,9 +161,6 @@ public String getHelp() {
161161

162162
@Override
163163
public void processOpts() {
164-
setUseOas2(true);
165-
additionalProperties.put(CodegenConstants.USE_OAS2, true);
166-
167164
// Process java8 option before common java ones to change the default dateLibrary to java8.
168165
if (additionalProperties.containsKey(JAVA8_MODE)) {
169166
this.setJava8(Boolean.valueOf(additionalProperties.get(JAVA8_MODE).toString()));
@@ -310,6 +307,8 @@ public void processOpts() {
310307
(sourceFolder + File.separator + basePackage).replace(".", java.io.File.separator), "Swagger2SpringBoot.java"));
311308
supportingFiles.add(new SupportingFile("RFC3339DateFormat.mustache",
312309
(sourceFolder + File.separator + basePackage).replace(".", java.io.File.separator), "RFC3339DateFormat.java"));
310+
supportingFiles.add(new SupportingFile("swaggerUiConfiguration.mustache",
311+
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "SwaggerUiConfiguration.java"));
313312
supportingFiles.add(new SupportingFile("application.mustache",
314313
("src.main.resources").replace(".", java.io.File.separator), "application.properties"));
315314
}
@@ -322,7 +321,7 @@ public void processOpts() {
322321
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "SwaggerUiConfiguration.java"));
323322
supportingFiles.add(new SupportingFile("RFC3339DateFormat.mustache",
324323
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "RFC3339DateFormat.java"));
325-
supportingFiles.add(new SupportingFile("application.properties",
324+
supportingFiles.add(new SupportingFile("application.properties.mustache",
326325
("src.main.resources").replace(".", java.io.File.separator), "swagger.properties"));
327326
}
328327
if (library.equals(SPRING_CLOUD_LIBRARY)) {
@@ -476,7 +475,7 @@ public void addOperationToGroup(String tag, String resourcePath, Operation opera
476475

477476
@Override
478477
public String getArgumentsLocation() {
479-
return null;
478+
return "/arguments/server.yaml";
480479
}
481480

482481
@Override
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#useOas2}}
2+
{{#allowableValues}}allowableValues="{{#values}}{{{.}}}{{^@last}}, {{/@last}}{{/values}}{{^values}}range=[{{#min}}{{.}}{{/min}}{{^min}}-infinity{{/min}}, {{#max}}{{.}}{{/max}}{{^max}}infinity{{/max}}]{{/values}}"{{/allowableValues}}
3+
{{/useOas2}}
4+
{{^useOas2}}
5+
{{#allowableValues}}allowableValues={ {{#values}}"{{{.}}}"{{^@last}}, {{/@last}}{{/values}}{{^values}}{{/values}} }{{#min}}, minimum="{{.}}"{{/min}}{{#max}}, maximum="{{.}}"{{/max}}{{/allowableValues}}
6+
{{/useOas2}}

src/main/resources/handlebars/JavaSpring/api.mustache

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,20 @@ package {{package}};
1010
{{#jdk8-no-delegate}}
1111
import com.fasterxml.jackson.databind.ObjectMapper;
1212
{{/jdk8-no-delegate}}
13+
{{#useOas2}}
1314
import io.swagger.annotations.*;
15+
{{/useOas2}}
16+
{{^useOas2}}
17+
import io.swagger.v3.oas.annotations.Operation;
18+
import io.swagger.v3.oas.annotations.Parameter;
19+
import io.swagger.v3.oas.annotations.enums.ParameterIn;
20+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
21+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
22+
import io.swagger.v3.oas.annotations.media.ArraySchema;
23+
import io.swagger.v3.oas.annotations.media.Content;
24+
import io.swagger.v3.oas.annotations.media.Schema;
25+
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
26+
{{/useOas2}}
1427
{{#jdk8-no-delegate}}
1528
import org.slf4j.Logger;
1629
import org.slf4j.LoggerFactory;
@@ -54,7 +67,9 @@ import java.util.Optional;
5467
import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture{{/jdk8}};
5568
{{/async}}
5669
{{>generatedAnnotation}}
70+
{{#useOas2}}
5771
@Api(value = "{{{baseName}}}", description = "the {{{baseName}}} API")
72+
{{/useOas2}}
5873
{{#operations}}
5974
public interface {{classname}} {
6075
{{#jdk8}}
@@ -81,6 +96,7 @@ public interface {{classname}} {
8196
{{#operation}}
8297
{{#contents}}
8398

99+
{{#useOas2}}
84100
@ApiOperation(value = "{{{summary}}}", nickname = "{{{operationId}}}", notes = "{{{notes}}}"{{#returnBaseType}}, response = {{{returnBaseType}}}.class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = {
85101
{{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = { {{#each scopes}}
86102
@AuthorizationScope(scope = "{{@key}}", description = "{{this}}"){{^@last}},{{/@last}}{{/each}}
@@ -96,6 +112,19 @@ public interface {{classname}} {
96112
{{/headerParams}}
97113
})
98114
{{/implicitHeaders}}
115+
{{/useOas2}}
116+
{{^useOas2}}
117+
@Operation(summary = "{{{summary}}}", description = "{{{notes}}}"{{#hasAuthMethods}}, security = {
118+
{{#authMethods}}@SecurityRequirement(name = "{{name}}"{{#isOAuth}}, scopes = {
119+
{{#scopes}}"{{scope}}"{{#hasMore}},
120+
{{/hasMore}}{{/scopes}}
121+
}{{/isOAuth}}){{#hasMore}},
122+
{{/hasMore}}{{/authMethods}}
123+
}{{/hasAuthMethods}}, tags={ {{#vendorExtensions.x-tags}}"{{tag}}"{{#hasMore}}, {{/hasMore}}{{/vendorExtensions.x-tags}} })
124+
@ApiResponses(value = { {{#responses}}
125+
@ApiResponse(responseCode = "{{{code}}}", description = "{{{message}}}"{{^vendorExtensions.x-java-is-response-void}}{{#baseType}}, content = @Content({{^containerType}}schema = @Schema(implementation = {{{baseType}}}.class)){{/containerType}}{{#containerType}}array = @ArraySchema(schema = @Schema(implementation = {{{baseType}}}.class))){{/containerType}}{{/baseType}}{{/vendorExtensions.x-java-is-response-void}}){{#hasMore}},
126+
{{/hasMore}}{{/responses}} })
127+
{{/useOas2}}
99128
@RequestMapping(value = "{{{path}}}",{{#singleContentTypes}}{{#hasProduces}}
100129
produces = "{{{vendorExtensions.x-accepts}}}", {{/hasProduces}}{{#hasConsumes}}
101130
consumes = "{{{vendorExtensions.x-contentType}}}",{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}

src/main/resources/handlebars/JavaSpring/apiController.mustache

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,25 @@ package {{package}};
88
import com.fasterxml.jackson.databind.ObjectMapper;
99
{{/isDelegate}}
1010
{{#fullController}}
11+
{{#useOas2}}
1112
import io.swagger.annotations.*;
13+
{{/useOas2}}
14+
{{^useOas2}}
15+
import io.swagger.v3.oas.annotations.Operation;
16+
import io.swagger.v3.oas.annotations.Parameter;
17+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
18+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
19+
import io.swagger.v3.oas.annotations.media.ArraySchema;
20+
import io.swagger.v3.oas.annotations.media.Content;
21+
import io.swagger.v3.oas.annotations.media.Schema;
22+
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
23+
{{/useOas2}}
1224
import org.slf4j.Logger;
1325
import org.slf4j.LoggerFactory;
1426
import org.springframework.http.HttpStatus;
1527
import org.springframework.http.ResponseEntity;
1628
{{/fullController}}
17-
import org.springframework.stereotype.Controller;
29+
import org.springframework.web.bind.annotation.RestController;
1830
{{#fullController}}
1931
import org.springframework.web.bind.annotation.CookieValue;
2032
import org.springframework.web.bind.annotation.PathVariable;
@@ -51,7 +63,7 @@ import java.util.concurrent.Callable;
5163
{{/async}}
5264
{{/fullController}}
5365
{{>generatedAnnotation}}
54-
@Controller
66+
@RestController
5567
{{#operations}}
5668
public class {{classname}}Controller implements {{classname}} {
5769

src/main/resources/handlebars/JavaSpring/apiDelegate.mustache

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,19 @@ package {{package}};
55
{{#jdk8}}
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
{{/jdk8}}
8+
{{#useOas2}}
89
import io.swagger.annotations.*;
10+
{{/useOas2}}
11+
{{^useOas2}}
12+
import io.swagger.v3.oas.annotations.Operation;
13+
import io.swagger.v3.oas.annotations.Parameter;
14+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
15+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
16+
import io.swagger.v3.oas.annotations.media.ArraySchema;
17+
import io.swagger.v3.oas.annotations.media.Content;
18+
import io.swagger.v3.oas.annotations.media.Schema;
19+
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
20+
{{/useOas2}}
921
{{#jdk8}}
1022
import org.slf4j.Logger;
1123
import org.slf4j.LoggerFactory;
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
{{#useOas2}}
12
springfox.documentation.swagger.v2.path=/api-docs
2-
server.contextPath={{^contextPath}}/{{/contextPath}}{{#contextPath}}{{contextPath}}{{/contextPath}}
3+
{{/useOas2}}
4+
{{^useOas2}}
5+
springfox.documentation.open-api.v3.path=/api-docs
6+
{{/useOas2}}
7+
server.servlet.contextPath={{^contextPath}}/{{/contextPath}}{{#contextPath}}{{contextPath}}{{/contextPath}}
38
server.port={{serverPort}}
49
spring.jackson.date-format={{basePackage}}.RFC3339DateFormat
510
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

src/main/resources/handlebars/JavaSpring/application.properties

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{#useOas2}}
2+
springfox.documentation.swagger.v2.path=/api-docs
3+
{{/useOas2}}
4+
{{^useOas2}}
5+
springfox.documentation.open-api.v3.path=/api-docs
6+
{{/useOas2}}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
{{#isBodyParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{^isContainer}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) {{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestBody {{{dataType}}} {{paramName}}{{/isBodyParam}}
1+
{{#isBodyParam}}
2+
{{#useOas2}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{^isContainer}}{{#allowableValues}}, {{> allowableValues }}{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/useOas2}}{{^useOas2}}@Parameter(in = ParameterIn.DEFAULT, description = "{{{description}}}" {{#required}},required=true{{/required}},schema=@Schema({{#allowableValues}}{{> allowableValues }}{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})){{/useOas2}} {{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestBody {{{dataType}}} {{paramName}}
3+
{{/isBodyParam}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isCookieParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{#values}}{{{.}}}{{^@last}}, {{/@last}}{{#@last}}{{/@last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @CookieValue(value="{{baseName}}", required={{#required}}true{{/required}}{{^required}}false{{/required}}) {{>optionalDataType}} {{paramName}}{{/isCookieParam}}
1+
{{#isCookieParam}}{{#useOas2}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}}{{#allowableValues}}, {{> allowableValues }}{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/useOas2}}{{^useOas2}}@Parameter(in = ParameterIn.COOKIE, description = "{{{description}}}" {{#required}},required=true{{/required}},schema=@Schema({{#allowableValues}}{{> allowableValues }}{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})){{/useOas2}} @CookieValue(value="{{baseName}}", required={{#required}}true{{/required}}{{^required}}false{{/required}}) {{>optionalDataType}} {{paramName}}{{/isCookieParam}}

0 commit comments

Comments
 (0)