You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2022/05/03 10:52:00 UTC

[jira] [Commented] (CAMEL-18040) OpenApi Specification Generator Does not generate oneOf when annotation @Schema(oneOf = {X.class, Y.class}) is specified on a class

    [ https://issues.apache.org/jira/browse/CAMEL-18040?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17531138#comment-17531138 ] 

Claus Ibsen commented on CAMEL-18040:
-------------------------------------

If you have the opportunity then you are welcome to dive into the generator source code, you can potentially find the spot where we need to add the code to detect the Scheme oneOf annotation from the java code to use for the json output.

> OpenApi Specification Generator Does not generate oneOf when annotation @Schema(oneOf = {X.class, Y.class}) is specified on a class 
> ------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-18040
>                 URL: https://issues.apache.org/jira/browse/CAMEL-18040
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-rest-openapi
>    Affects Versions: 3.14.2
>            Reporter: Johnathan Ingram
>            Priority: Minor
>
>  
> Given the following classes
> {code:java}
> @Schema(oneOf = {FormA.class, FormB.class})
> public abstract class Form {    
> } {code}
>  
>  
>  
> {code:java}
> public class FormA extends Form {    
>     String code;
>     String a;    
>     int b;
>     
>     public String getCode() {        return this.code;    }
>     public void setCode(String code) {        this.code = code;    }
>     public String getA() {        return this.a;    }
>     public void setA(String a) {        this.a = a;    }
>     public int getB() {        return this.b;    }
>     public void setB(int b) {        this.b = b;    }
> } {code}
>  
> {code:java}
> public class FormB extends Form {    
>     String code;
>     int x;    
>     String y;
>     public String getCode() {        return this.code;    }
>     public void setCode(String code) {        this.code = code;    }
>     public int getX() {        return this.x;    }
>     public void setX(int x) {        this.x = x;    }
>     public String getY() {        return this.y;    }
>     public void setY(String y) {        this.y = y;    }
> } {code}
> {code:java}
> public class Wrapper {        
>     @JsonProperty("system")    String system;
>     @JsonProperty("form")    Form form;
>     public String getSystem() {        return this.system;    }
>     public void setSystem(String system) {        this.system = system;    }
>     public Form getForm() {        return this.form;    }
>     @JsonTypeInfo(        use = JsonTypeInfo.Id.NAME,         include = JsonTypeInfo.As.EXTERNAL_PROPERTY,         property = "system")      @JsonSubTypes({         @Type(value = FormA.class, name = "Form A"),         @Type(value = FormB.class, name = "Form B")       })              
>     public void setForm(Form form) {        this.form = form;    }
> } {code}
> And finally the request of a Camel Rest Endpoint
> {code:java}
> rest("/prototype/")           
> .id("rest.proto.oneof")            
> .post("oneof")            
> .bindingMode(RestBindingMode.json)                        .description("Prototype OneOf")            
> .id("proto.oneof")                        
> .consumes("application/json")            
> .produces(MediaType.APPLICATION_JSON )            
> .type(Wrapper.class)                                    
> .responseMessage()                
> .code(200).message("Oneof working")            
> .endResponseMessage() 
> ....{code}
> The OpenAPI specification is correct except for the Form class in the schema components section
> {code:java}
> "Form" : {        
>    "type" : "object"      
> },      
> "FormA" : {        
>    "type" : "object",        
>    "properties" : {
>           "code" : {
>             "type" : "string"
>           },
>           "a" : {
>             "type" : "string"
>           },
>           "b" : {
>             "format" : "int32",
>             "type" : "integer"
>           }
>         }
>       },
> "FormB" : {
>         "type" : "object",
>         "properties" : {
>           "code" : {
>             "type" : "string"
>           },
>           "x" : {
>             "format" : "int32",
>             "type" : "integer"
>           },
>           "y" : {
>             "type" : "string"
>           }
>         }
>       },
>       "Wrapper" : {
>         "type" : "object",
>         "properties" : {
>           "system" : {
>             "type" : "string"
>           },
>           "form" : {
>             "$ref" : "#/components/schemas/Form"
>           }
>         }
>       }
>     }
>  {code}
> NOTE: Form should be
> {code:java}
> "Form" : { 
> "oneOf" : [
>    ....
> ] 
> },  {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.7#820007)