Skip to content

Commit 303bb3f

Browse files
committed
refs swagger-api/swagger-codegen#8833 - fix spring templates, add defaultInterfaces, springboot v2
1 parent f760ecb commit 303bb3f

File tree

184 files changed

+139
-7541
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

184 files changed

+139
-7541
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ public void processOpts() {
376376
} else {
377377
importMapping.put("Schema", "io.swagger.v3.oas.annotations.media.Schema");
378378
}
379-
379+
380380
importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty");
381381
importMapping.put("JsonSubTypes", "com.fasterxml.jackson.annotation.JsonSubTypes");
382382
importMapping.put("JsonTypeInfo", "com.fasterxml.jackson.annotation.JsonTypeInfo");
@@ -398,7 +398,7 @@ public void processOpts() {
398398
if(additionalProperties.containsKey(JAVA8_MODE)) {
399399
setJava8Mode(Boolean.parseBoolean(additionalProperties.get(JAVA8_MODE).toString()));
400400
if ( java8Mode ) {
401-
additionalProperties.put("java8", "true");
401+
additionalProperties.put("java8", true);
402402
}
403403
}
404404

@@ -427,7 +427,7 @@ public void processOpts() {
427427
importMapping.put("LocalDate", "org.joda.time.LocalDate");
428428
importMapping.put("DateTime", "org.joda.time.DateTime");
429429
} else if (dateLibrary.startsWith("java8")) {
430-
additionalProperties.put("java8", "true");
430+
additionalProperties.put("java8", true);
431431
additionalProperties.put("jsr310", "true");
432432
typeMapping.put("date", "LocalDate");
433433
importMapping.put("LocalDate", "java.time.LocalDate");
@@ -1345,7 +1345,7 @@ private String deriveInvokerPackageName(String input) {
13451345
public void setSupportJava6(boolean value) {
13461346
this.supportJava6 = value;
13471347
}
1348-
1348+
13491349
public String toRegularExpression(String pattern) {
13501350
return escapeText(pattern);
13511351
}
@@ -1401,7 +1401,7 @@ public void setLanguageArguments(List<CodegenArgument> languageArguments) {
14011401
.value(Boolean.FALSE.toString()));
14021402
}
14031403
}
1404-
1404+
14051405
super.setLanguageArguments(languageArguments);
14061406
}
14071407
}

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

Lines changed: 0 additions & 775 deletions
This file was deleted.

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

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
import io.swagger.codegen.v3.SupportingFile;
1616
import io.swagger.codegen.v3.generators.features.BeanValidationFeatures;
1717
import io.swagger.codegen.v3.generators.features.OptionalFeatures;
18-
import io.swagger.codegen.v3.templates.MustacheTemplateEngine;
19-
import io.swagger.codegen.v3.templates.TemplateEngine;
2018
import io.swagger.codegen.v3.utils.URLPathUtil;
2119
import io.swagger.v3.oas.models.OpenAPI;
2220
import io.swagger.v3.oas.models.Operation;
@@ -41,9 +39,6 @@
4139
import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME;
4240
import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue;
4341

44-
/*
45-
DEPRECATED, Spring Boot 1 is in maintenance mode only. Please use JavaSpring2.
46-
*/
4742
public class SpringCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures {
4843
static Logger LOGGER = LoggerFactory.getLogger(SpringCodegen.class);
4944
public static final String DEFAULT_LIBRARY = "spring-boot";
@@ -53,7 +48,6 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation
5348
public static final String INTERFACE_ONLY = "interfaceOnly";
5449
public static final String DELEGATE_PATTERN = "delegatePattern";
5550
public static final String SINGLE_CONTENT_TYPES = "singleContentTypes";
56-
public static final String JAVA_8 = "java8";
5751
public static final String ASYNC = "async";
5852
public static final String RESPONSE_WRAPPER = "responseWrapper";
5953
public static final String USE_TAGS = "useTags";
@@ -63,6 +57,8 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation
6357
public static final String SWAGGER_DOCKET_CONFIG = "swaggerDocketConfig";
6458
public static final String TARGET_OPENFEIGN = "generateForOpenFeign";
6559
public static final String DEFAULT_INTERFACES = "defaultInterfaces";
60+
public static final String SPRING_BOOT_VERSION = "springBootVersion";
61+
public static final String SPRING_BOOT_VERSION_2 = "springBootV2";
6662

6763
protected String title = "swagger-petstore";
6864
protected String configPackage = "io.swagger.configuration";
@@ -81,6 +77,7 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation
8177
protected boolean useOptional = false;
8278
protected boolean openFeign = false;
8379
protected boolean defaultInterfaces = true;
80+
protected String springBootVersion = "1.5.22.RELEASE";
8481

8582
public SpringCodegen() {
8683
super();
@@ -102,7 +99,6 @@ public SpringCodegen() {
10299
cliOptions.add(CliOption.newBoolean(INTERFACE_ONLY, "Whether to generate only API interface stubs without the server files."));
103100
cliOptions.add(CliOption.newBoolean(DELEGATE_PATTERN, "Whether to generate the server files using the delegate pattern"));
104101
cliOptions.add(CliOption.newBoolean(SINGLE_CONTENT_TYPES, "Whether to select only one produces/consumes content-type by operation."));
105-
cliOptions.add(CliOption.newBoolean(JAVA_8, "use java8 default interface"));
106102
cliOptions.add(CliOption.newBoolean(ASYNC, "use async Callable controllers"));
107103
cliOptions.add(new CliOption(RESPONSE_WRAPPER, "wrap the responses in given type (Future,Callable,CompletableFuture,ListenableFuture,DeferredResult,HystrixCommand,RxObservable,RxSingle or fully qualified type)"));
108104
cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames"));
@@ -124,6 +120,14 @@ public SpringCodegen() {
124120
library.setEnum(supportedLibraries);
125121
library.setDefault(DEFAULT_LIBRARY);
126122
cliOptions.add(library);
123+
124+
CliOption springBootVersionOption = new CliOption(SPRING_BOOT_VERSION, "Spring boot version");
125+
Map<String, String> springBootEnum = new HashMap<>();
126+
springBootEnum.put("1.5.22.RELEASE", "1.5.22.RELEASE");
127+
springBootEnum.put("2.1.7.RELEASE", "2.1.7.RELEASE");
128+
springBootVersionOption.setEnum(springBootEnum);
129+
cliOptions.add(springBootVersionOption);
130+
127131
}
128132

129133
@Override
@@ -147,15 +151,23 @@ public void processOpts() {
147151
additionalProperties.put(CodegenConstants.USE_OAS2, true);
148152

149153
// Process java8 option before common java ones to change the default dateLibrary to java8.
150-
if (additionalProperties.containsKey(JAVA_8)) {
151-
this.setJava8(Boolean.valueOf(additionalProperties.get(JAVA_8).toString()));
154+
if (additionalProperties.containsKey(JAVA8_MODE)) {
155+
this.setJava8(Boolean.valueOf(additionalProperties.get(JAVA8_MODE).toString()));
156+
}
157+
158+
if (additionalProperties.containsKey(DATE_LIBRARY)) {
159+
if (additionalProperties.get(DATE_LIBRARY).toString().startsWith("java8")) {
160+
this.setJava8(Boolean.valueOf(additionalProperties.get(JAVA8_MODE).toString()));
161+
}
152162
}
153163
if (this.java8) {
154164
additionalProperties.put("javaVersion", "1.8");
155-
additionalProperties.put("jdk8", "true");
165+
additionalProperties.put("jdk8", true);
156166
if (!additionalProperties.containsKey(DATE_LIBRARY)) {
157167
setDateLibrary("java8");
158168
}
169+
} else {
170+
this.defaultInterfaces = false;
159171
}
160172

161173
// set invokerPackage as basePackage
@@ -201,10 +213,6 @@ public void processOpts() {
201213
this.setSingleContentTypes(Boolean.valueOf(additionalProperties.get(SINGLE_CONTENT_TYPES).toString()));
202214
}
203215

204-
if (additionalProperties.containsKey(JAVA_8)) {
205-
this.setJava8(Boolean.valueOf(additionalProperties.get(JAVA_8).toString()));
206-
}
207-
208216
if (additionalProperties.containsKey(ASYNC)) {
209217
this.setAsync(Boolean.valueOf(additionalProperties.get(ASYNC).toString()));
210218
}
@@ -231,7 +239,16 @@ public void processOpts() {
231239

232240
if (additionalProperties.containsKey(DEFAULT_INTERFACES)) {
233241
this.setDefaultInterfaces(Boolean.valueOf(additionalProperties.get(DEFAULT_INTERFACES).toString()));
234-
additionalProperties.put(DEFAULT_INTERFACES, this.defaultInterfaces);
242+
}
243+
additionalProperties.put(DEFAULT_INTERFACES, this.defaultInterfaces);
244+
245+
if (additionalProperties.containsKey(SPRING_BOOT_VERSION)) {
246+
this.springBootVersion = additionalProperties.get(SPRING_BOOT_VERSION).toString();
247+
}
248+
additionalProperties.put(SPRING_BOOT_VERSION, this.springBootVersion);
249+
if (springBootVersion.startsWith("2")) {
250+
additionalProperties.put(SPRING_BOOT_VERSION_2, true);
251+
this.setOpenFeign(true);
235252
}
236253

237254
if (useBeanValidation) {
@@ -260,7 +277,7 @@ public void processOpts() {
260277
} else {
261278
throw new IllegalArgumentException(
262279
String.format("Can not generate code with `%s` and `%s` true while `%s` is false.",
263-
DELEGATE_PATTERN, INTERFACE_ONLY, JAVA_8));
280+
DELEGATE_PATTERN, INTERFACE_ONLY, JAVA8_MODE));
264281
}
265282
}
266283

@@ -270,6 +287,7 @@ public void processOpts() {
270287
if (!this.interfaceOnly) {
271288

272289
if (library.equals(DEFAULT_LIBRARY)) {
290+
apiTestTemplateFiles.clear();
273291
supportingFiles.add(new SupportingFile("homeController.mustache",
274292
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "HomeController.java"));
275293
supportingFiles.add(new SupportingFile("swagger2SpringBoot.mustache",
@@ -296,13 +314,24 @@ public void processOpts() {
296314
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "ApiKeyRequestInterceptor.java"));
297315
supportingFiles.add(new SupportingFile("clientConfiguration.mustache",
298316
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "ClientConfiguration.java"));
299-
supportingFiles.add(new SupportingFile("Application.mustache",
300-
(testFolder + File.separator + basePackage).replace(".", java.io.File.separator), "Application.java"));
301317
apiTemplateFiles.put("apiClient.mustache", "Client.java");
302318
if (!additionalProperties.containsKey(SINGLE_CONTENT_TYPES)) {
303319
additionalProperties.put(SINGLE_CONTENT_TYPES, "true");
304320
this.setSingleContentTypes(true);
305321
}
322+
if (additionalProperties.containsKey(CodegenConstants.GENERATE_API_TESTS)) {
323+
if (Boolean.valueOf(additionalProperties.get(CodegenConstants.GENERATE_API_TESTS).toString())) {
324+
// TODO Api Tests are not currently supported in spring-cloud template
325+
apiTestTemplateFiles.clear();
326+
supportingFiles.add(new SupportingFile("application-test.mustache",
327+
("src.test.resources").replace(".", java.io.File.separator), "application.yml"));
328+
supportingFiles.add(new SupportingFile("TestUtils.mustache",
329+
(testFolder + File.separator + basePackage).replace(".", java.io.File.separator), "TestUtils.java"));
330+
supportingFiles.add(new SupportingFile("Application.mustache",
331+
(testFolder + File.separator + basePackage).replace(".", java.io.File.separator), "Application.java"));
332+
333+
}
334+
}
306335
} else {
307336
apiTemplateFiles.put("apiController.mustache", "Controller.java");
308337
supportingFiles.add(new SupportingFile("apiException.mustache",
@@ -321,6 +350,9 @@ public void processOpts() {
321350
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "SwaggerDocumentationConfig.java"));
322351
}
323352

353+
if (this.interfaceOnly) {
354+
apiTestTemplateFiles.clear();
355+
}
324356
if ("threetenbp".equals(dateLibrary)) {
325357
supportingFiles.add(new SupportingFile("customInstantDeserializer.mustache",
326358
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "CustomInstantDeserializer.java"));
@@ -341,8 +373,6 @@ public void processOpts() {
341373
}
342374

343375
if (this.java8) {
344-
additionalProperties.put("javaVersion", "1.8");
345-
additionalProperties.put("jdk8", "true");
346376
if (this.async) {
347377
additionalProperties.put(RESPONSE_WRAPPER, "CompletableFuture");
348378
}
@@ -351,7 +381,7 @@ public void processOpts() {
351381
}
352382

353383
if(this.openFeign){
354-
additionalProperties.put("isOpenFeign", "true");
384+
additionalProperties.put("isOpenFeign", true);
355385
}
356386

357387
// Some well-known Spring or Spring-Cloud response wrappers
@@ -393,6 +423,10 @@ public void execute(Template.Fragment fragment, Writer writer) throws IOExceptio
393423
writer.write(fragment.execute().replaceAll("\\r|\\n", ""));
394424
}
395425
});
426+
427+
if ((this.java8 && !this.defaultInterfaces) || !this.java8) {
428+
additionalProperties.put("fullController", true);
429+
}
396430
}
397431

398432
@Override

src/main/resources/META-INF/services/io.swagger.codegen.v3.CodegenConfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ io.swagger.codegen.v3.generators.java.JavaResteasyEapServerCodegen
1616
io.swagger.codegen.v3.generators.java.JavaResteasyServerCodegen
1717
io.swagger.codegen.v3.generators.java.MicronautCodegen
1818
io.swagger.codegen.v3.generators.java.SpringCodegen
19-
io.swagger.codegen.v3.generators.java.Spring2Codegen
2019
io.swagger.codegen.v3.generators.nodejs.NodeJSServerCodegen
2120
io.swagger.codegen.v3.generators.openapi.OpenAPIGenerator
2221
io.swagger.codegen.v3.generators.openapi.OpenAPIYamlGenerator
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package {{basePackage}};
2+
3+
import java.util.Random;
4+
import java.util.concurrent.atomic.AtomicLong;
5+
6+
public class TestUtils {
7+
private static final AtomicLong atomicId = createAtomicId();
8+
9+
public static long nextId() {
10+
return atomicId.getAndIncrement();
11+
}
12+
13+
private static AtomicLong createAtomicId() {
14+
int baseId = new Random(System.currentTimeMillis()).nextInt(1000000) + 20000;
15+
return new AtomicLong((long) baseId);
16+
}
17+
}

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ public interface {{classname}} {
6161
{{^isDelegate}}
6262
Logger log = LoggerFactory.getLogger({{classname}}.class);
6363

64-
default Optional<ObjectMapper> getObjectMapper() {
64+
{{#defaultInterfaces}}default {{/defaultInterfaces}}Optional<ObjectMapper> getObjectMapper(){{^defaultInterfaces}};{{/defaultInterfaces}}{{#defaultInterfaces}}{
6565
return Optional.empty();
66-
}
66+
}{{/defaultInterfaces}}
6767

68-
default Optional<HttpServletRequest> getRequest() {
68+
{{#defaultInterfaces}}default {{/defaultInterfaces}}Optional<HttpServletRequest> getRequest(){{^defaultInterfaces}};{{/defaultInterfaces}}{{#defaultInterfaces}}{
6969
return Optional.empty();
70-
}
70+
}{{/defaultInterfaces}}
7171

72-
default Optional<String> getAcceptHeader() {
72+
{{#defaultInterfaces}}default Optional<String> getAcceptHeader() {
7373
return getRequest().map(r -> r.getHeader("Accept"));
74-
}
74+
}{{/defaultInterfaces}}
7575
{{/isDelegate}}
7676
{{#isDelegate}}
7777
{{classname}}Delegate getDelegate();
@@ -81,9 +81,8 @@ public interface {{classname}} {
8181
{{#contents}}
8282

8383
@ApiOperation(value = "{{{summary}}}", nickname = "{{{operationId}}}", notes = "{{{notes}}}"{{#returnBaseType}}, response = {{{returnBaseType}}}.class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = {
84-
{{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = {
85-
{{#scopes}}@AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}},
86-
{{/hasMore}}{{/scopes}}
84+
{{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = { {{#each scopes}}
85+
@AuthorizationScope(scope = "{{@key}}", description = "{{this}}"){{^@last}},{{/@last}}{{/each}}
8786
}{{/isOAuth}}){{#hasMore}},
8887
{{/hasMore}}{{/authMethods}}
8988
}{{/hasAuthMethods}}, tags={ {{#vendorExtensions.x-tags}}"{{tag}}",{{/vendorExtensions.x-tags}} })

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package {{package}};
22

3-
{{^jdk8}}
3+
{{#fullController}}
44
{{#imports}}import {{import}};
55
{{/imports}}
6-
{{/jdk8}}
6+
{{/fullController}}
77
{{^isDelegate}}
88
import com.fasterxml.jackson.databind.ObjectMapper;
99
{{/isDelegate}}
10-
{{^jdk8}}
10+
{{#fullController}}
1111
import io.swagger.annotations.*;
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414
import org.springframework.http.HttpStatus;
1515
import org.springframework.http.ResponseEntity;
16-
{{/jdk8}}
16+
{{/fullController}}
1717
import org.springframework.stereotype.Controller;
18-
{{^jdk8}}
18+
{{#fullController}}
1919
import org.springframework.web.bind.annotation.PathVariable;
2020
import org.springframework.web.bind.annotation.RequestBody;
2121
import org.springframework.web.bind.annotation.RequestHeader;
@@ -27,7 +27,7 @@ import org.springframework.web.multipart.MultipartFile;
2727
import javax.validation.constraints.*;
2828
import javax.validation.Valid;
2929
{{/useBeanValidation}}
30-
{{/jdk8}}
30+
{{/fullController}}
3131
{{^isDelegate}}
3232
import javax.servlet.http.HttpServletRequest;
3333
{{#jdk8}}
@@ -39,7 +39,7 @@ import java.util.Optional;
3939
import java.util.Optional;
4040
{{/useOptional}}
4141
{{/jdk8-no-delegate}}
42-
{{^jdk8}}
42+
{{#fullController}}
4343
{{^isDelegate}}
4444
import java.io.IOException;
4545
{{/isDelegate}}
@@ -48,7 +48,7 @@ import java.util.Map;
4848
{{#async}}
4949
import java.util.concurrent.Callable;
5050
{{/async}}
51-
{{/jdk8}}
51+
{{/fullController}}
5252
{{>generatedAnnotation}}
5353
@Controller
5454
{{#operations}}
@@ -70,10 +70,10 @@ public class {{classname}}Controller implements {{classname}} {
7070
{{/jdk8}}
7171
{{/isDelegate}}
7272
{{^isDelegate}}
73-
{{^jdk8}}
73+
{{#fullController}}
7474
private static final Logger log = LoggerFactory.getLogger({{classname}}Controller.class);
7575

76-
{{/jdk8}}
76+
{{/fullController}}
7777
private final ObjectMapper objectMapper;
7878

7979
private final HttpServletRequest request;
@@ -97,7 +97,7 @@ public class {{classname}}Controller implements {{classname}} {
9797
{{/jdk8}}
9898

9999
{{/isDelegate}}
100-
{{^jdk8}}
100+
{{#fullController}}
101101
{{#operation}}
102102
{{#contents}}
103103
public {{#async}}Callable<{{/async}}ResponseEntity<{{>returnTypes}}>{{#async}}>{{/async}} {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) {
@@ -145,6 +145,6 @@ public class {{classname}}Controller implements {{classname}} {
145145

146146
{{/contents}}
147147
{{/operation}}
148-
{{/jdk8}}
148+
{{/fullController}}
149149
}
150150
{{/operations}}

0 commit comments

Comments
 (0)