springdoc / springdoc-openapi

Library for OpenAPI 3 with spring-boot
https://springdoc.org
Apache License 2.0
3.29k stars 500 forks source link

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

Closed abccbaandy closed 1 month ago

abccbaandy commented 2 months ago

Also, according to this issue https://github.com/springdoc/springdoc-openapi/issues/2704 I think this issue relate to Springdoc now, instead swagger core, because even I use my own converter to "fix" it, it will overwrite by Springdoc's converter.

bnasslahsen commented 1 month ago

@abccbaandy,

There is no definition of Child3 in you code. Not reproducible. Feel free to provide a Minimal, Reproducible Example - with HelloController that reproduces the problem.

This ticket will be closed, but can be reopened if your provide the reproducible sample.

abccbaandy commented 1 month ago

@bnasslahsen

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