Skip to content

Commit 433e06a

Browse files
committed
fix (JAVA CLIENTS): fix useOneOfInterfaces not generating interfaces for java clients jersey2, jersey3, microprofile, native & okhttp-gson (#17419)
1 parent 3500d83 commit 433e06a

File tree

7 files changed

+108
-4
lines changed

7 files changed

+108
-4
lines changed

modules/openapi-generator/src/main/resources/Java/libraries/jersey2/model.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ import com.fasterxml.jackson.core.type.TypeReference;
5858
{{/-first}}
5959
{{/oneOf}}
6060

61-
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/isEnum}}
61+
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/vendorExtensions.x-is-one-of-interface}}{{/isEnum}}
6262
{{/model}}
6363
{{/models}}

modules/openapi-generator/src/main/resources/Java/libraries/jersey3/model.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ import com.fasterxml.jackson.core.type.TypeReference;
5858
{{/-first}}
5959
{{/oneOf}}
6060

61-
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/isEnum}}
61+
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/vendorExtensions.x-is-one-of-interface}}{{/isEnum}}
6262
{{/model}}
6363
{{/models}}

modules/openapi-generator/src/main/resources/Java/libraries/microprofile/model.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ import {{rootJavaEEPackage}}.validation.Valid;
5555
{{>enumOuterClass}}
5656
{{/isEnum}}
5757
{{^isEnum}}
58+
{{#vendorExtensions.x-is-one-of-interface}}
59+
{{>oneof_interface}}
60+
{{/vendorExtensions.x-is-one-of-interface}}
61+
{{^vendorExtensions.x-is-one-of-interface}}
5862
{{>pojo}}
63+
{{/vendorExtensions.x-is-one-of-interface}}
5964
{{/isEnum}}
6065
{{/model}}
6166
{{/models}}

modules/openapi-generator/src/main/resources/Java/libraries/native/model.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,6 @@ import com.fasterxml.jackson.core.type.TypeReference;
6262
{{/-first}}
6363
{{/oneOf}}
6464

65-
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/isEnum}}
65+
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/vendorExtensions.x-is-one-of-interface}}{{/isEnum}}
6666
{{/model}}
6767
{{/models}}

modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/model.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ import org.hibernate.validator.constraints.*;
3030

3131
{{#models}}
3232
{{#model}}
33-
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/isEnum}}
33+
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{^isEnum}}{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{#oneOf}}{{#-first}}{{>oneof_model}}{{/-first}}{{/oneOf}}{{^oneOf}}{{#anyOf}}{{#-first}}{{>anyof_model}}{{/-first}}{{/anyOf}}{{^anyOf}}{{>pojo}}{{/anyOf}}{{/oneOf}}{{/vendorExtensions.x-is-one-of-interface}}{{/isEnum}}
3434
{{/model}}
3535
{{/models}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.openapitools.codegen.java.assertions.JavaFileAssert;
3535
import org.openapitools.codegen.languages.AbstractJavaCodegen;
3636
import org.openapitools.codegen.languages.JavaClientCodegen;
37+
import org.openapitools.codegen.languages.SpringCodegen;
3738
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
3839
import org.openapitools.codegen.languages.features.CXFServerFeatures;
3940
import org.openapitools.codegen.meta.features.SecurityFeature;
@@ -3636,4 +3637,40 @@ public void testClientWithAnyOfCausedCompileError(String client) {
36363637

36373638
validateJavaSourceFiles(files);
36383639
}
3640+
3641+
@Test(dataProvider = "allJavaClients")
3642+
public void testClientWithUseOneOfInterface_issue_17419(String client) {
3643+
// given
3644+
final Path output = newTempFolder();
3645+
final OpenAPI openAPI = new OpenAPIParser()
3646+
.readLocation("src/test/resources/bugs/issue_17419.yaml", null, new ParseOptions())
3647+
.getOpenAPI();
3648+
final JavaClientCodegen codegen = new JavaClientCodegen();
3649+
codegen.setOutputDir(output.toString());
3650+
codegen.setUseOneOfInterfaces(true);
3651+
codegen.setLibrary(client);
3652+
3653+
final ClientOptInput input = new ClientOptInput().openAPI(openAPI).config(codegen);
3654+
3655+
// when
3656+
List<File> files = new DefaultGenerator().opts(input).generate();
3657+
3658+
// then
3659+
validateJavaSourceFiles(files);
3660+
3661+
TestUtils.assertFileContains(
3662+
output.resolve("src/main/java/org/openapitools/client/model/Details.java"),
3663+
"public interface Details {"
3664+
);
3665+
TestUtils.assertFileContains(
3666+
output.resolve("src/main/java/org/openapitools/client/model/InlineDetails.java"),
3667+
"implements Details"
3668+
);
3669+
TestUtils.assertFileContains(
3670+
output.resolve("src/main/java/org/openapitools/client/model/ReferencedDetails.java"),
3671+
"implements Details"
3672+
);
3673+
3674+
}
3675+
36393676
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
openapi: 3.0.0
2+
info:
3+
title: OneOf interface bug
4+
version: '1.0'
5+
servers:
6+
- url: 'http://localhost:8080/etudes/v1'
7+
description: LOCAL
8+
paths:
9+
'/myapi/myendpoint/{id}':
10+
get:
11+
responses:
12+
'200':
13+
description: OK
14+
content:
15+
application/json:
16+
schema:
17+
type: object
18+
title: MyResponse
19+
properties:
20+
id:
21+
type: integer
22+
format: int64
23+
items:
24+
type: array
25+
items:
26+
$ref: '#/components/schemas/MyItem'
27+
operationId: get-value
28+
parameters:
29+
- schema:
30+
type: string
31+
name: id
32+
in: path
33+
required: true
34+
security:
35+
- MySecurity: []
36+
components:
37+
schemas:
38+
MyItem:
39+
type: object
40+
properties:
41+
id:
42+
type: integer
43+
format: int64
44+
details:
45+
title: Details
46+
oneOf:
47+
- title: ReferencedDetails
48+
type: object
49+
properties:
50+
idDetails:
51+
type: string
52+
- title: InlineDetails
53+
type: object
54+
properties:
55+
name:
56+
type: string
57+
countryCode:
58+
type: string
59+
securitySchemes:
60+
MySecurity:
61+
type: http
62+
scheme: bearer

0 commit comments

Comments
 (0)