-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature][Java/Spring] Support Discriminator Based OneOf Interface #11650
Changes from all commits
6a8769e
049359c
49f13eb
1a5a484
66a09d2
48a1a4a
a811330
299cdb3
461cbc8
dd0118d
26a95f6
9af7db6
fbfd57d
bfab304
29003d8
d864831
6d54799
c6a5c6b
d96cd2e
8f09f52
0d31df4
397e711
a922217
21a98e5
1b5964e
05105fa
c89a28b
4808e87
03a6210
7db40af
f634245
921e9b8
9502601
054cfda
cb998d4
79e6439
cbfa506
7a93562
2773e1e
d850256
595fb2c
6a542a0
da50e04
ca1c72a
e0d7905
6dfe29e
3849661
79c80f8
a1a4ff0
bd6ba44
4ff2187
45d1fd2
2650814
25ac888
fe29270
6e3150b
bcbd156
5e77e8c
6202d69
e20ba2c
d676188
122d414
c1ce27a
be407dc
26ae1a9
c0f153f
aaf6e99
c1a7192
925252e
58bd55b
af28bbe
d6558a8
d03f748
b345151
f8b70a8
c161329
833893a
6e01140
d43692e
deeb394
e619e73
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
generatorName: spring | ||
outputDir: samples/openapi3/server/petstore/spring-boot-oneof | ||
inputSpec: modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml | ||
templateDir: modules/openapi-generator/src/main/resources/JavaSpring | ||
additionalProperties: | ||
groupId: org.openapitools.openapi3 | ||
documentationProvider: springdoc | ||
artifactId: springboot-oneof | ||
snapshotVersion: "true" | ||
hideGenerationTimestamp: "true" |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,7 +46,7 @@ import javax.annotation.Generated; | |
{{>enumOuterClass}} | ||
{{/isEnum}} | ||
{{^isEnum}} | ||
{{>pojo}} | ||
{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{>pojo}}{{/vendorExtensions.x-is-one-of-interface}} | ||
cachescrubber marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this still necessary after #11784 ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, very much so. It the model entity is a one-of-interface, a |
||
{{/isEnum}} | ||
{{/model}} | ||
{{/models}} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
{{>additionalModelTypeAnnotations}} | ||
{{#withXml}} | ||
{{>xmlAnnotation}} | ||
{{/withXml}} | ||
{{#discriminator}} | ||
{{>typeInfoAnnotation}} | ||
{{/discriminator}} | ||
{{>generatedAnnotation}} | ||
public interface {{classname}}{{#vendorExtensions.x-implements}}{{#-first}} extends {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} { | ||
{{#discriminator}} | ||
public {{propertyType}} {{propertyGetter}}(); | ||
{{/discriminator}} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,21 @@ | ||
{{#jackson}} | ||
{{#discriminator.mappedModels}} | ||
{{#-first}} | ||
@JsonIgnoreProperties( | ||
value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization | ||
allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization | ||
) | ||
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) | ||
@JsonSubTypes({ | ||
{{#discriminator.mappedModels}} | ||
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), | ||
{{/discriminator.mappedModels}} | ||
}){{/jackson}} | ||
{{/-first}} | ||
{{^vendorExtensions.x-discriminator-value}} | ||
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{mappingName}}}"){{^-last}},{{/-last}} | ||
{{/vendorExtensions.x-discriminator-value}} | ||
{{#vendorExtensions.x-discriminator-value}} | ||
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{vendorExtensions.x-discriminator-value}}}"){{^-last}},{{/-last}} | ||
{{/vendorExtensions.x-discriminator-value}} | ||
{{#-last}} | ||
}) | ||
{{/-last}} | ||
{{/discriminator.mappedModels}} | ||
{{/jackson}} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
openapi: 3.0.1 | ||
info: | ||
title: ByRefOrValue | ||
description: > | ||
This tests for a oneOf interface representation | ||
version: 0.0.1 | ||
servers: | ||
- url: "http://localhost:8080" | ||
tags: | ||
- name: Foo | ||
paths: | ||
/foo: | ||
get: | ||
tags: | ||
- Foo | ||
summary: GET all Foos | ||
operationId: getAllFoos | ||
responses: | ||
'200': | ||
$ref: '#/components/responses/200FooArray' | ||
post: | ||
tags: | ||
- Foo | ||
summary: Create a Foo | ||
operationId: createFoo | ||
requestBody: | ||
$ref: '#/components/requestBodies/Foo' | ||
responses: | ||
'201': | ||
$ref: '#/components/responses/201Foo' | ||
|
||
components: | ||
schemas: | ||
Entity: | ||
type: object | ||
allOf: | ||
- "$ref": "#/components/schemas/Addressable" | ||
- "$ref": "#/components/schemas/Extensible" | ||
|
||
EntityRef: | ||
description: Entity reference schema to be use for all entityRef class. | ||
type: object | ||
properties: | ||
name: | ||
type: string | ||
description: Name of the related entity. | ||
'@referredType': | ||
type: string | ||
description: The actual type of the target instance when needed for disambiguation. | ||
allOf: | ||
- $ref: '#/components/schemas/Addressable' | ||
- "$ref": "#/components/schemas/Extensible" | ||
|
||
|
||
Addressable: | ||
type: object | ||
properties: | ||
href: | ||
type: string | ||
description: Hyperlink reference | ||
id: | ||
type: string | ||
description: unique identifier | ||
description: Base schema for adressable entities | ||
Extensible: | ||
type: object | ||
properties: | ||
"@schemaLocation": | ||
type: string | ||
description: A URI to a JSON-Schema file that defines additional attributes | ||
and relationships | ||
"@baseType": | ||
type: string | ||
description: When sub-classing, this defines the super-class | ||
"@type": | ||
type: string | ||
description: When sub-classing, this defines the sub-class Extensible name | ||
required: | ||
- '@type' | ||
|
||
FooRefOrValue: | ||
cachescrubber marked this conversation as resolved.
Show resolved
Hide resolved
|
||
type: object | ||
oneOf: | ||
- $ref: "#/components/schemas/Foo" | ||
- $ref: "#/components/schemas/FooRef" | ||
discriminator: | ||
propertyName: "@type" | ||
mapping: | ||
Foo: "#/components/schemas/Foo" | ||
FooRef: "#/components/schemas/FooRef" | ||
|
||
Foo: | ||
type: object | ||
properties: | ||
fooPropA: | ||
type: string | ||
fooPropB: | ||
type: string | ||
allOf: | ||
- $ref: '#/components/schemas/Entity' | ||
|
||
FooRef: | ||
type: object | ||
properties: | ||
foorefPropA: | ||
type: string | ||
allOf: | ||
- $ref: '#/components/schemas/EntityRef' | ||
|
||
requestBodies: | ||
Foo: | ||
description: The Foo to be created | ||
content: | ||
application/json;charset=utf-8: | ||
schema: | ||
$ref: '#/components/schemas/Foo' | ||
responses: | ||
'204': | ||
description: Deleted | ||
content: { } | ||
201Foo: | ||
description: Error | ||
content: | ||
application/json: | ||
schema: | ||
$ref: '#/components/schemas/FooRefOrValue' | ||
200FooArray: | ||
description: Success | ||
content: | ||
application/json;charset=utf-8: | ||
schema: | ||
type: array | ||
items: | ||
$ref: '#/components/schemas/FooRefOrValue' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this mean that GSON does't work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. There is a GSON implementation in okhttp-gson-nextgen and another java based generator. Does the spring generator supports GSON?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there is a configuration option for it, but I'm not sure how widely used ti it