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

@Schema oneOf config is ignored when generate the api-docs #4732

Open
abccbaandy opened this issue Sep 11, 2024 · 3 comments
Open

@Schema oneOf config is ignored when generate the api-docs #4732

abccbaandy opened this issue Sep 11, 2024 · 3 comments

Comments

@abccbaandy
Copy link

    @Schema(oneOf = {Child1.class, Child2.class})
    private Parent obj;

The result is something like this

                    "MyPojo": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/Child1"
                            },
                            {
                                "$ref": "#/components/schemas/Child2"
                            },
                            {
                                "$ref": "#/components/schemas/Child3"
                            }
                        ]
                    },

Seems the result does not come from my config.

Also I think oneOf should take string($ref) instead class?

@ponelat
Copy link
Member

ponelat commented Sep 20, 2024

@abccbaandy could you clarify what your expectations are? And provide a complete example.

@abccbaandy
Copy link
Author

My expectations should be like this, only child1 and child2(from my @Schema(oneOf) config

                    "MyPojo": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/Child1"
                            },
                            {
                                "$ref": "#/components/schemas/Child2"
                            }
                        ]
                    },

@ponelat How about oneOf with $ref?
Sometimes I have complex schema like Child1ForSomeBiz, seems no way to set now?

@abccbaandy
Copy link
Author

@ponelat

Here is the smallest working code for the issue.

pojo define

@JsonSubTypes({
        @JsonSubTypes.Type(value = Child1.class),
        @JsonSubTypes.Type(value = Child2.class),
        @JsonSubTypes.Type(value = Child3.class),
})
@Data
public abstract class Parent {
    private String parentProperty;
}

@EqualsAndHashCode(callSuper = true)
@Data
public class Child1 extends Parent {
    private String childProperty1;
}

@EqualsAndHashCode(callSuper = true)
@Data
public class Child2 extends Parent {
    private String childProperty2;
}

@EqualsAndHashCode(callSuper = true)
@Data
public class Child3 extends Parent {
    private String childProperty3;
}

usage in controller

@Data
public class MyRequest {
    @Schema(oneOf = {Child1.class, Child2.class})
    private Parent parent;
}

@PostMapping("swaggerTest")
public String swaggerTest(@RequestBody MyRequest myRequest) {
  return null;
}

api-docs

    "components": {
        "schemas": {
            "Child1": {
                "type": "object",
                "allOf": [
                    {
                        "$ref": "#/components/schemas/Parent"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "childProperty1": {
                                "type": "string"
                            }
                        }
                    }
                ]
            },
            "Child2": {
                "type": "object",
                "allOf": [
                    {
                        "$ref": "#/components/schemas/Parent"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "childProperty2": {
                                "type": "string"
                            }
                        }
                    }
                ]
            },
            "Child3": {
                "type": "object",
                "allOf": [
                    {
                        "$ref": "#/components/schemas/Parent"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "childProperty3": {
                                "type": "string"
                            }
                        }
                    }
                ]
            },
            "MyRequest": {
                "type": "object",
                "properties": {
                    "parent": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/Child1"
                            },
                            {
                                "$ref": "#/components/schemas/Child2"
                            },
                            {
                                "$ref": "#/components/schemas/Child3"
                            }
                        ]
                    }
                }
            },
            "Parent": {
                "type": "object",
                "properties": {
                    "parentProperty": {
                        "type": "string"
                    }
                },
                "oneOf": [
                    {
                        "$ref": "#/components/schemas/Child1"
                    },
                    {
                        "$ref": "#/components/schemas/Child2"
                    }
                ]
            }
        }
    }

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

No branches or pull requests

2 participants