Skip to content

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

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

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"
                    }
                ]
            }
        }
    }

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

No branches or pull requests

2 participants