Skip to content
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

Does not work with Jackson inheritance hierarchy #103

Closed
ethlo opened this issue Dec 22, 2021 · 4 comments
Closed

Does not work with Jackson inheritance hierarchy #103

ethlo opened this issue Dec 22, 2021 · 4 comments

Comments

@ethlo
Copy link

ethlo commented Dec 22, 2021

Hi, and thank you for providing a tool to generate OpenAPI 3.0 documentation now that Springfox seems defunct!

However, I encounter problems with any type-hierarchy. For example the following Animal, Dog/Cat
hierarchy fails.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes({
  @JsonSubTypes.Type(value = Dog.class, name = "DOG"),
  @JsonSubTypes.Type(value = Cat.class, name = "CAT"),
})

Throws the following exception:

Caused by: java.lang.IllegalStateException: Duplicate key for values de.qaware.openapigeneratorforspring.common.schema.resolver.type.extension.jackson.TypeResolverForJacksonPolymorphism$1@973c35b vs. de.qaware.openapigeneratorforspring.common.schema.resolver.properties.DefaultSchemaPropertiesResolver$SchemaPropertyImpl@7a7d1d9d
	at de.qaware.openapigeneratorforspring.common.util.OpenApiMapUtils.lambda$buildMapFromStream$0(OpenApiMapUtils.java:92)
	at java.base/java.util.HashMap.merge(HashMap.java:1297)
	at java.base/java.util.stream.Collectors.lambda$toMap$68(Collectors.java:1658)
	at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
	at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:274)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
	at de.qaware.openapigeneratorforspring.common.util.OpenApiMapUtils.buildMapFromStream(OpenApiMapUtils.java:88)
	at de.qaware.openapigeneratorforspring.common.util.OpenApiMapUtils.buildMapFromStream(OpenApiMapUtils.java:66)
	at de.qaware.openapigeneratorforspring.common.util.OpenApiMapUtils.buildStringMapFromStream(OpenApiMapUtils.java:58)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.type.TypeResolverForObject.resolve(TypeResolverForObject.java:78)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context.runTypeResolvers(DefaultSchemaResolver.java:108)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context.buildSchemaFromTypeRecursively(DefaultSchemaResolver.java:102)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$TypeResolverAction.run(DefaultSchemaResolver.java:240)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context$TypeResolverActions.lambda$runRecursively$0(DefaultSchemaResolver.java:198)
	at java.base/java.lang.Iterable.forEach(Iterable.java:75)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context$TypeResolverActions.runRecursively(DefaultSchemaResolver.java:197)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context.runTypeResolvers(DefaultSchemaResolver.java:118)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver$Context.buildSchemaFromTypeRecursively(DefaultSchemaResolver.java:102)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver.resolveFromTypeWithoutReference(DefaultSchemaResolver.java:83)
	at de.qaware.openapigeneratorforspring.common.schema.resolver.DefaultSchemaResolver.resolveFromType(DefaultSchemaResolver.java:74)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.lambda$buildRequestBody$3(DefaultRequestBodyOperationCustomizer.java:73)
	at java.base/java.util.Optional.ifPresent(Optional.java:183)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.lambda$buildRequestBody$4(DefaultRequestBodyOperationCustomizer.java:73)
	at java.base/java.util.Collections$SingletonList.forEach(Collections.java:4856)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.buildRequestBody(DefaultRequestBodyOperationCustomizer.java:69)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.lambda$applyFromMethod$2(DefaultRequestBodyOperationCustomizer.java:62)
	at java.base/java.util.Optional.map(Optional.java:265)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.applyFromMethod(DefaultRequestBodyOperationCustomizer.java:62)
	at de.qaware.openapigeneratorforspring.common.operation.customizer.DefaultRequestBodyOperationCustomizer.customize(DefaultRequestBodyOperationCustomizer.java:54)
	at de.qaware.openapigeneratorforspring.common.operation.OperationBuilder.lambda$buildOperationInternal$5(OperationBuilder.java:74)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at de.qaware.openapigeneratorforspring.common.operation.OperationBuilder.buildOperationInternal(OperationBuilder.java:74)
	at de.qaware.openapigeneratorforspring.common.operation.OperationBuilder.buildOperation(OperationBuilder.java:46)
	... 139 common frames omitted
@neiser
Copy link
Collaborator

neiser commented Dec 29, 2021

@ethlo I havn't checked in detail, but an integration with pretty much those annotations on a base class seems to work fine for me: This controller definition with one mapping produces a OpenApi spec which looks reasonable.

Can you provide a Pull Request which reproduces your issue above? Then I'm able to help you and/or fix the issue. Feel free to adapt the "app54" test case!

@ethlo
Copy link
Author

ethlo commented Jan 3, 2022

Hi again! Thanks for your feedback. I now opened up a PR with a test (app103) that reproduces my encountered exception. Please let me know if I can be of any further assistance.

@neiser
Copy link
Collaborator

neiser commented Jan 3, 2022

@ethlo I've released 5.1.2 with a fix (which makes your test case succeed). Note that using Jackson polymorphism in this manner via EXISTING_PROPERTY needs some "duplication" of the "enum values" for the type property. But well, now this library supports this. Jackson polymorphism support is far from feature complete though.

@ethlo
Copy link
Author

ethlo commented Jan 3, 2022

@neiser I realize that the model is defined in a less than ideal way, so thank you for accommodating this! Much appreciated! Works like a charm!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants