Skip to content

Commit 4184754

Browse files
committed
feat: update Java Micronaut generator to support Micronaut 3
- fix useBeanValidation option application - add support for choosing Reactive Streams implementation for generated code through library option - remove @controller annotation from generated interfaces, as it is not @inherited anyway - use jakarta inject implementation instead of javax, as Micronaut now uses it by default - generate stub controllers when skipSupportFiles is disabled to be able to run tests and start generated application - fix bean validation annotations - add cookies parameters support - use @Body instead of @QueryValue for form parameters generation - update pom.xml to use Micronaut 3
1 parent 261c90d commit 4184754

23 files changed

+226
-155
lines changed

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

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.codegen.v3.generators.java;
22

3+
import com.github.jknack.handlebars.Handlebars;
34
import com.github.jknack.handlebars.Lambda;
45
import com.google.common.collect.ImmutableMap;
56
import io.swagger.codegen.v3.*;
@@ -30,10 +31,17 @@
3031
public class MicronautCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures {
3132

3233
private static Logger LOGGER = LoggerFactory.getLogger(MicronautCodegen.class);
34+
private static final String DEFAULT_LIBRARY = "rxjava2";
35+
private static final String RXJAVA3_LIBRARY = "rxjava3";
36+
private static final String REACTOR_LIBRARY = "reactor";
3337
private static final String TITLE = "title";
3438
private static final String CONFIG_PACKAGE = "configPackage";
3539
private static final String BASE_PACKAGE = "basePackage";
3640
private static final String USE_TAGS = "useTags";
41+
private static final String USE_RXJAVA = "useRxJava";
42+
private static final String USE_RXJAVA2 = "useRxJava2";
43+
private static final String USE_RXJAVA3 = "useRxJava3";
44+
private static final String USE_REACTOR = "useReactor";
3745
private static final String IMPLICIT_HEADERS = "implicitHeaders";
3846
private static final String SKIP_SUPPORT_FILES = "skipSupportFiles";
3947

@@ -69,12 +77,18 @@ private void init() {
6977
cliOptions.add(new CliOption(BASE_PACKAGE, "base package (invokerPackage) for generated code"));
7078
cliOptions.add(new CliOption(SKIP_SUPPORT_FILES, "skip support files such as pom.xml, mvnw, etc from code generation."));
7179
cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames"));
72-
cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations"));
80+
81+
CliOption useBeanValidation = CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations");
82+
useBeanValidation.setDefault("true");
83+
cliOptions.add(useBeanValidation);
84+
7385
cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers."));
7486
cliOptions.add(CliOption.newBoolean(USE_OPTIONAL,
7587
"Use Optional container for optional parameters"));
7688

77-
supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application.");
89+
supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application with RxJava2 reactive streams implementation");
90+
supportedLibraries.put(RXJAVA3_LIBRARY, "Java Micronaut Server application with RxJava3 reactive streams implementation");
91+
supportedLibraries.put(REACTOR_LIBRARY, "Java Micronaut Server application with Project Reactor reactive streams implementation");
7892
setLibrary(DEFAULT_LIBRARY);
7993

8094
CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
@@ -155,17 +169,18 @@ public void processOpts() {
155169
skipSupportFiles = Boolean.valueOf(additionalProperties.get(SKIP_SUPPORT_FILES).toString());
156170
}
157171

158-
if (useBeanValidation) {
159-
writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
160-
}
172+
writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
161173

162174
if (additionalProperties.containsKey(IMPLICIT_HEADERS)) {
163175
this.setImplicitHeaders(Boolean.valueOf(additionalProperties.get(IMPLICIT_HEADERS).toString()));
164176
}
165177

166-
if (useOptional) {
167-
writePropertyBack(USE_OPTIONAL, useOptional);
168-
}
178+
writePropertyBack(USE_OPTIONAL, useOptional);
179+
180+
additionalProperties.put(USE_RXJAVA, isRxJava2Library() || isRxJava3Library());
181+
additionalProperties.put(USE_RXJAVA2, isRxJava2Library());
182+
additionalProperties.put(USE_RXJAVA3, isRxJava3Library());
183+
additionalProperties.put(USE_REACTOR, isReactorLibrary());
169184

170185
if (!skipSupportFiles) {
171186
supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml"));
@@ -175,6 +190,7 @@ public void processOpts() {
175190
supportingFiles.add(new SupportingFile("unsupportedOperationExceptionHandler.mustache",
176191
(sourceFolder + File.separator + configPackage).replace(".", File.separator), "UnsupportedOperationExceptionHandler.java"));
177192
supportingFiles.add(new SupportingFile("mainApplication.mustache", (sourceFolder + File.separator).replace(".", File.separator), "MainApplication.java"));
193+
apiTemplateFiles.put("apiController.mustache", "Controller.java");
178194
}
179195
addHandlebarsLambdas(additionalProperties);
180196
}
@@ -529,4 +545,22 @@ public void setUseBeanValidation(boolean useBeanValidation) {
529545
public void setUseOptional(boolean useOptional) {
530546
this.useOptional = useOptional;
531547
}
548+
549+
@Override
550+
public void addHandlebarHelpers(Handlebars handlebars) {
551+
handlebars.setInfiniteLoops(true);
552+
super.addHandlebarHelpers(handlebars);
553+
}
554+
555+
private boolean isRxJava2Library() {
556+
return library.equals(DEFAULT_LIBRARY);
557+
}
558+
559+
private boolean isRxJava3Library() {
560+
return library.equals(RXJAVA3_LIBRARY);
561+
}
562+
563+
private boolean isReactorLibrary() {
564+
return library.equals(REACTOR_LIBRARY);
565+
}
532566
}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@ package {{package}};
1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import io.micronaut.http.*;
1212
import io.micronaut.http.annotation.*;
13+
{{#useRxJava2}}
1314
import io.reactivex.Single;
15+
{{/useRxJava2}}
16+
{{#useRxJava3}}
17+
import io.reactivex.rxjava3.core.Single;
18+
{{/useRxJava3}}
1419
import io.swagger.v3.oas.annotations.*;
1520
import io.swagger.v3.oas.annotations.responses.*;
16-
import org.slf4j.Logger;
17-
import org.slf4j.LoggerFactory;
21+
{{#useReactor}}
22+
import org.reactivestreams.Publisher;
23+
import reactor.core.publisher.Mono;
24+
{{/useReactor}}
1825

1926
{{#useBeanValidation}}
2027
import javax.annotation.Nullable;
@@ -24,11 +31,12 @@ import javax.validation.constraints.*;
2431
import java.io.IOException;
2532
import java.util.List;
2633
import java.util.Map;
34+
{{#useOptional}}
2735
import java.util.Optional;
36+
{{/useOptional}}
2837

2938
{{>generatedAnnotation}}
3039
{{#operations}}
31-
@Controller
3240
public interface {{classname}} {
3341
3442
{{#operation}}
@@ -46,8 +54,8 @@ public interface {{classname}} {
4654
})
4755
{{/implicitHeaders}}
4856
@{{#lambda.capitalise}}{{httpMethod}}{{/lambda.capitalise}}(value = "{{{path}}}"{{#hasProduces}}, produces = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }{{/hasProduces}}{{#hasConsumes}}, consumes = {{braces "left"}}{{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}}{{braces "right"}}{{/hasConsumes}})
49-
default Single<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) {
50-
return Single.fromCallable(() -> {
57+
default {{>publisher}}<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>cookieParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) {
58+
return {{#useRxJava}}Single{{/useRxJava}}{{#useReactor}}Mono{{/useReactor}}.fromCallable(() -> {
5159
throw new UnsupportedOperationException();
5260
});
5361
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package {{package}};
2+
3+
{{#imports}}
4+
import {{import}};
5+
6+
{{/imports}}
7+
import io.micronaut.http.annotation.Controller;
8+
import io.micronaut.http.HttpResponse;
9+
{{#useRxJava2}}
10+
import io.reactivex.Single;
11+
{{/useRxJava2}}
12+
{{#useRxJava3}}
13+
import io.reactivex.rxjava3.core.Single;
14+
{{/useRxJava3}}
15+
{{#useReactor}}
16+
import org.reactivestreams.Publisher;
17+
import reactor.core.publisher.Mono;
18+
{{/useReactor}}
19+
20+
{{#useBeanValidation}}
21+
import javax.annotation.Nullable;
22+
import javax.validation.Valid;
23+
import javax.validation.constraints.*;
24+
{{/useBeanValidation}}
25+
import java.util.List;
26+
import java.util.Map;
27+
{{#useOptional}}
28+
import java.util.Optional;
29+
{{/useOptional}}
30+
31+
{{#operations}}
32+
@Controller
33+
public class {{classname}}Controller implements {{classname}} {
34+
{{#operation}}
35+
{{#contents}}
36+
37+
@Override
38+
public {{>publisher}}<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{#useBeanValidation}}{{!
39+
Bean validation spec for path parameters (PathParam is always required)
40+
}}{{#isPathParam}}{{>beanValidationParams}}{{/isPathParam}}{{!
41+
Bean validation spec for any other parameters
42+
}}{{^isPathParam}}{{>nullableBeanValidationParams}}{{/isPathParam}}{{/useBeanValidation}}{{!
43+
Method argument type and name
44+
}}{{>optionalDataType}} {{paramName}}{{!
45+
Arguments separator, if required
46+
}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) {
47+
// TODO: Implement me
48+
return {{classname}}.super.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}});
49+
}
50+
{{/contents}}
51+
{{/operation}}
52+
}
53+
{{/operations}}

src/main/resources/handlebars/JavaMicronaut/api_test.mustache

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ package {{package}};
55

66
import io.micronaut.http.HttpResponse;
77
import io.micronaut.http.HttpStatus;
8-
import io.micronaut.test.annotation.MicronautTest;
8+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
99
import org.junit.jupiter.api.Test;
10+
{{#useReactor}}
11+
import reactor.core.publisher.Mono;
12+
{{/useReactor}}
1013

11-
import javax.inject.Inject;
14+
import jakarta.inject.Inject;
1215

1316
import java.util.*;
1417

@@ -29,7 +32,13 @@ class {{classname}}ControllerTest {
2932
{{{dataType}}} {{paramName}} = {{{example}}};
3033
{{/parameters}}
3134
try {
32-
api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}).blockingGet();
35+
{{#useReactor}}Mono.from({{/useReactor}}api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}){{#useReactor}}){{/useReactor}}
36+
{{#useRxJava}}
37+
.blockingGet();
38+
{{/useRxJava}}
39+
{{#useReactor}}
40+
.block();
41+
{{/useReactor}}
3342
} catch (UnsupportedOperationException e) {
3443
assumeTrue(false, "API is not yet implemented");
3544
}

src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
{{/required}}{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}
44
@Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{#isNotContainer}}{{^isPrimitiveType}}
55
@Valid{{/isPrimitiveType}}{{/isNotContainer}}
6-
{{>beanValidationCore}}
6+
{{>beanValidationCore}}

src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{#useBeanValidation}}{{>beanValidationParamsInner}}{{>beanValidationCore}}{{/useBeanValidation}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{{^isPrimitiveType}}{{^isEnum}}{{!
2+
Non-container
3+
}}{{^isContainer}}@Valid {{/isContainer}}{{!
4+
Container
5+
}}{{#isContainer}}{{#items}}{{>beanValidationParamsInner}}{{/items}}{{/isContainer}}{{/isEnum}}{{/isPrimitiveType}}

src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)