Currently, openapi-generator doesn't support oneOf. It currently generates the following broken code, outputting UNKNOWN_BASE_TYPE rather than Pet for the example below.
The code is broken with or without the discriminator in the Spec.
default ResponseEntity<Void> _petsPost(@ApiParam(value = "" ) @Valid @RequestBody(required = false) UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE) {
return petsPost(UNKNOWN_BASE_TYPE);
}
pom.xml
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.3</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
<generatorName>spring</generatorName>
<generateSupportingFiles>true</generateSupportingFiles>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<library>spring-boot</library>
<java8>true</java8>
<interfaceOnly>true</interfaceOnly>
<skipDefaultInterface>false</skipDefaultInterface>
<delegatePattern>true</delegatePattern>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
api.yaml
openapi: "3.0.2"
info:
version: 1.0.0
title: Polymorphism
paths:
/pets:
post:
requestBody:
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
discriminator:
propertyName: pet_type
responses:
'200':
description: created
components:
schemas:
# Parent
Pet:
type: object
required:
- pet_type
properties:
pet_type:
type: string
eats:
type: string
discriminator:
propertyName: pet_type
# Child 1
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: boolean
# Child 2
Cat:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Cat`
properties:
climbs:
type: boolean
pom.xml with openapi-generator-maven-plugin 4.2.3api.yaml file abovemvn clean compile\target\generated-sources\openapi\src\gen\java\main\org\openapitools\api\PetsApi.javaThis bug is related to the Server side Java code (SpringBoot)
@bkabrda has already merged PR for client Jackson Client side: https://github.com/OpenAPITools/openapi-generator/pull/5120
Try apply client side fix from https://github.com/OpenAPITools/openapi-generator/pull/5120 to server side.
馃憤 Thanks for opening this issue!
馃彿 I have applied any labels matching special text in your issue.
The team will review the labels and make any necessary changes.
Line it's failing on DefaultCodegen.java#L5404
@bkabrda Any pointers on possible fix here? I assume SpringCodegen needs to postProcess the model in some way to configure the Base interface/class to use for each anyOf schema?
https://github.com/OpenAPITools/openapi-generator/blob/ea55968737fa80a3e306d1b08032ff4d911774c9/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java#L585
@dkirrane hey 馃憢 so in order to use the whole oneOf machinery I implemented, you'll need to do couple of things (your previous comment says "anyOf", but I think that's a typo and should have been "oneOf" - what I did only supports oneOf right now):
useOneOfInterfaces = true (and since it's Java, you'll also have to add addOneOfInterfaceImports = true).preprocessOpenAPI and/or postProcessAllModels, you need to make sure they call super.<theMethod> so that the whole machinery is actually called.addImportsToOneOfInterface method on the generator (take a look at JavaClientCodegen, I'd think that it would contain pretty much what you need, maybe you could even move it to AbstractJavaCodegen and get that shared for the server codegen).Let me know if this helps. Thanks!
@bkabrda Hey! Do you know if there are any updates on this issue? It would be really nice to have this feature :)
Hello @bkabrda !! Would be great if your java client oneOf interface behaviour is extended to all java generators ...
Any update or by-pass available today ?
Thanks
Most helpful comment
@bkabrda Hey! Do you know if there are any updates on this issue? It would be really nice to have this feature :)