Skip to content

Commit ce59f5a

Browse files
authored
fix: issue 23548 (add support for sealed response interfaces for spring-declarative-http-interface) (#23549)
# Conflicts: # modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java
1 parent c90cfa7 commit ce59f5a

2 files changed

Lines changed: 43 additions & 8 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
{{! handle reactive map and array}}
22
{{#reactive}}
33
{{#isMap}}
4-
{{#reactiveModeReactor}}Mono<{{/reactiveModeReactor}}{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}Map<String, {{{returnType}}}>{{#useResponseEntity}}>{{/useResponseEntity}}{{#reactiveModeReactor}}>{{/reactiveModeReactor}}
4+
{{#reactiveModeReactor}}Mono<{{/reactiveModeReactor}}{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}Map<String, {{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}>{{#useResponseEntity}}>{{/useResponseEntity}}{{#reactiveModeReactor}}>{{/reactiveModeReactor}}
55
{{/isMap}}
66
{{#isArray}}
77
{{! array handle reactive - reactor with/without ResponseEntity wrapper}}
88
{{#reactiveModeReactor}}
9-
{{#useResponseEntity}}Mono<ResponseEntity<{{/useResponseEntity}}Flux<{{{returnType}}}>{{#useResponseEntity}}>>{{/useResponseEntity}}
9+
{{#useResponseEntity}}Mono<ResponseEntity<{{/useResponseEntity}}Flux<{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}>{{#useResponseEntity}}>>{{/useResponseEntity}}
1010
{{/reactiveModeReactor}}
1111
{{! array handle reactive - coroutines with/without ResponseEntity wrapper}}
1212
{{#reactiveModeCoroutines}}
13-
{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}{{{returnContainer}}}<{{{returnType}}}>{{#useResponseEntity}}>{{/useResponseEntity}}
13+
{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}{{{returnContainer}}}<{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}>{{#useResponseEntity}}>{{/useResponseEntity}}
1414
{{/reactiveModeCoroutines}}
1515
{{/isArray}}
1616
{{! handle reactive non-container - with/without ResponseEntity wrapper}}
1717
{{^returnContainer}}
1818
{{#reactiveModeReactor}}
19-
Mono<{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}{{{returnType}}}{{#useResponseEntity}}>{{/useResponseEntity}}>
19+
Mono<{{#useResponseEntity}}ResponseEntity<{{/useResponseEntity}}{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}{{#useResponseEntity}}>{{/useResponseEntity}}>
2020
{{/reactiveModeReactor}}
2121
{{#reactiveModeCoroutines}}
2222
{{#useResponseEntity}}
23-
ResponseEntity<{{/useResponseEntity}}{{{returnType}}}{{#useResponseEntity}}>
23+
ResponseEntity<{{/useResponseEntity}}{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}{{#useResponseEntity}}>
2424
{{/useResponseEntity}}
2525
{{/reactiveModeCoroutines}}
2626
{{/returnContainer}}
@@ -29,19 +29,19 @@ ResponseEntity<{{/useResponseEntity}}{{{returnType}}}{{#useResponseEntity}}>
2929
{{! handle non-reactive map and array}}
3030
{{#isMap}}
3131
{{#useResponseEntity}}
32-
ResponseEntity<{{/useResponseEntity}}Map<String, {{{returnType}}}>{{#useResponseEntity}}>
32+
ResponseEntity<{{/useResponseEntity}}Map<String, {{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}>{{#useResponseEntity}}>
3333
{{/useResponseEntity}}
3434
{{/isMap}}
3535
{{#isArray}}
3636
{{! array handle non-reactive - with/without ResponseEntity wrapper}}
3737
{{#useResponseEntity}}
38-
ResponseEntity<{{/useResponseEntity}}{{{returnContainer}}}<{{{returnType}}}>{{#useResponseEntity}}>
38+
ResponseEntity<{{/useResponseEntity}}{{{returnContainer}}}<{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}>{{#useResponseEntity}}>
3939
{{/useResponseEntity}}
4040
{{/isArray}}
4141
{{! handle reactive non-container - with/without ResponseEntity wrapper}}
4242
{{^returnContainer}}
4343
{{#useResponseEntity}}
44-
ResponseEntity<{{/useResponseEntity}}{{{returnType}}}{{#useResponseEntity}}>
44+
ResponseEntity<{{/useResponseEntity}}{{#useSealedResponseInterfaces}}{{#vendorExtensions.x-sealed-response-interface}}{{vendorExtensions.x-sealed-response-interface}}{{/vendorExtensions.x-sealed-response-interface}}{{^vendorExtensions.x-sealed-response-interface}}{{{returnType}}}{{/vendorExtensions.x-sealed-response-interface}}{{/useSealedResponseInterfaces}}{{^useSealedResponseInterfaces}}{{{returnType}}}{{/useSealedResponseInterfaces}}{{#useResponseEntity}}>
4545
{{/useResponseEntity}}
4646
{{/returnContainer}}
4747
{{/reactive}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5946,4 +5946,39 @@ public void testOneOfRefEnumDiscriminatorResolvesType() throws IOException {
59465946
"override val vehicleType: VehicleType = VehicleType.TRUCK"
59475947
);
59485948
}
5949+
5950+
@Test
5951+
public void testSealedResponseInterfacesWithDeclarativeHttpInterface() throws IOException {
5952+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
5953+
output.deleteOnExit();
5954+
String outputPath = output.getAbsolutePath().replace('\\', '/');
5955+
5956+
OpenAPI openAPI = new OpenAPIParser()
5957+
.readLocation("src/test/resources/3_0/kotlin/sealed-response-interfaces.yaml", null, new ParseOptions()).getOpenAPI();
5958+
5959+
KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
5960+
codegen.setOutputDir(output.getAbsolutePath());
5961+
codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "org.openapitools.model");
5962+
codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "org.openapitools.api");
5963+
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface");
5964+
codegen.additionalProperties().put(USE_SEALED_RESPONSE_INTERFACES, "true");
5965+
codegen.additionalProperties().put(USE_RESPONSE_ENTITY, "true");
5966+
codegen.additionalProperties().put(REACTIVE, "false");
5967+
codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, "false");
5968+
5969+
ClientOptInput input = new ClientOptInput();
5970+
input.openAPI(openAPI);
5971+
input.config(codegen);
5972+
5973+
DefaultGenerator generator = new DefaultGenerator();
5974+
generator.opts(input).generate();
5975+
5976+
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/DefaultApi.kt"),
5977+
"import org.openapitools.model.CreateUserResponse",
5978+
"import org.openapitools.model.GetUserResponse",
5979+
"fun createUser(",
5980+
"): ResponseEntity<CreateUserResponse>",
5981+
"fun getUser(",
5982+
"): ResponseEntity<GetUserResponse>");
5983+
}
59495984
}

0 commit comments

Comments
 (0)