Skip to content

Commit 599f102

Browse files
committed
fix: issue 23548 (add support for sealed response interfaces for spring-declarative-http-interface)
1 parent c07f3a0 commit 599f102

2 files changed

Lines changed: 44 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: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5054,4 +5054,40 @@ public void shouldAddParameterWithInHeaderWhenImplicitHeadersIsTrue() throws IOE
50545054
Assert.assertTrue(content.contains("testHeader"),
50555055
"Header name 'testHeader' should appear in the annotation");
50565056
}
5057+
5058+
@Test
5059+
public void testSealedResponseInterfacesWithDeclarativeHttpInterface() throws IOException {
5060+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
5061+
output.deleteOnExit();
5062+
String outputPath = output.getAbsolutePath().replace('\\', '/');
5063+
5064+
OpenAPI openAPI = new OpenAPIParser()
5065+
.readLocation("src/test/resources/3_0/kotlin/sealed-response-interfaces.yaml", null, new ParseOptions()).getOpenAPI();
5066+
5067+
KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
5068+
codegen.setOutputDir(output.getAbsolutePath());
5069+
codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "org.openapitools.model");
5070+
codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "org.openapitools.api");
5071+
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface");
5072+
codegen.additionalProperties().put(USE_SEALED_RESPONSE_INTERFACES, "true");
5073+
codegen.additionalProperties().put(USE_RESPONSE_ENTITY, "true");
5074+
codegen.additionalProperties().put(REACTIVE, "false");
5075+
codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, "false");
5076+
5077+
ClientOptInput input = new ClientOptInput();
5078+
input.openAPI(openAPI);
5079+
input.config(codegen);
5080+
5081+
DefaultGenerator generator = new DefaultGenerator();
5082+
generator.opts(input).generate();
5083+
5084+
assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/DefaultApi.kt"),
5085+
"import org.openapitools.model.CreateUserResponse",
5086+
"import org.openapitools.model.GetUserResponse",
5087+
"fun createUser(",
5088+
"): ResponseEntity<CreateUserResponse>",
5089+
"fun getUser(",
5090+
"): ResponseEntity<GetUserResponse>");
5091+
}
5092+
50575093
}

0 commit comments

Comments
 (0)