Skip to content

Commit e221361

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

7 files changed

Lines changed: 108 additions & 5 deletions

File tree

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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,12 @@ import {{rootJavaEEPackage}}.validation.Valid;
5858

5959
{{/isEnum}}
6060
{{^isEnum}}
61+
{{#vendorExtensions.x-is-one-of-interface}}
62+
{{>oneof_interface}}
63+
{{/vendorExtensions.x-is-one-of-interface}}
64+
{{^vendorExtensions.x-is-one-of-interface}}
6165
{{>pojo}}
62-
66+
{{/vendorExtensions.x-is-one-of-interface}}
6367
{{/isEnum}}
6468
{{/model}}
6569
{{/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 {{jacksonPackage}}.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
@@ -40,6 +40,7 @@
4040
import org.openapitools.codegen.java.assertions.JavaFileAssert;
4141
import org.openapitools.codegen.languages.AbstractJavaCodegen;
4242
import org.openapitools.codegen.languages.JavaClientCodegen;
43+
import org.openapitools.codegen.languages.SpringCodegen;
4344
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
4445
import org.openapitools.codegen.languages.features.CXFServerFeatures;
4546
import org.openapitools.codegen.meta.features.SecurityFeature;
@@ -4351,4 +4352,40 @@ public void testClientWithAnyOfCausedCompileError(String client) {
43514352

43524353
validateJavaSourceFiles(files);
43534354
}
4355+
4356+
@Test(dataProvider = "allJavaClients")
4357+
public void testClientWithUseOneOfInterface_issue_17419(String client) {
4358+
// given
4359+
final Path output = newTempFolder();
4360+
final OpenAPI openAPI = new OpenAPIParser()
4361+
.readLocation("src/test/resources/bugs/issue_17419.yaml", null, new ParseOptions())
4362+
.getOpenAPI();
4363+
final JavaClientCodegen codegen = new JavaClientCodegen();
4364+
codegen.setOutputDir(output.toString());
4365+
codegen.setUseOneOfInterfaces(true);
4366+
codegen.setLibrary(client);
4367+
4368+
final ClientOptInput input = new ClientOptInput().openAPI(openAPI).config(codegen);
4369+
4370+
// when
4371+
List<File> files = new DefaultGenerator().opts(input).generate();
4372+
4373+
// then
4374+
validateJavaSourceFiles(files);
4375+
4376+
TestUtils.assertFileContains(
4377+
output.resolve("src/main/java/org/openapitools/client/model/Details.java"),
4378+
"public interface Details {"
4379+
);
4380+
TestUtils.assertFileContains(
4381+
output.resolve("src/main/java/org/openapitools/client/model/InlineDetails.java"),
4382+
"implements Details"
4383+
);
4384+
TestUtils.assertFileContains(
4385+
output.resolve("src/main/java/org/openapitools/client/model/ReferencedDetails.java"),
4386+
"implements Details"
4387+
);
4388+
4389+
}
4390+
43544391
}
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)