如何从java中的swagger文档中隐藏枚举值

问题描述 投票:0回答:1

使用 java 和 springdoc-openapi,我目前正在使用这样的枚举:


       enum Stage {
                    Stage1, Stage2 Stage3, Stage4 etc..;
            }

对于一个控制器,我想在 swagger UI 中显示所有值,首先作为显示选项的列表,然后是可供选择的下拉列表 - 这就是现在的工作情况。

对于另一个控制器,我想隐藏一个值。

这种行为可能吗?如果可能的话,如何实现?

我尝试使用带有自定义序列化器的 dto 来隐藏该值,但是 swagger ui 仅显示第一个值,作为没有下拉菜单的 json,可能是因为它无法识别 dto 持有枚举。

谢谢你

java spring swagger-ui
1个回答
0
投票

首先使用 Stage 的标准枚举定义

public enum Stage {
    Stage1, Stage2, Stage3, Stage4;
}

然后使用自定义序列化程序创建一个 DTO,用于隐藏其中一个枚举值。

public class CustomStageSerializer extends JsonSerializer<Stage> {
    @Override
    public void serialize(Stage stage, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
        throws IOException {
        // Serialize all stages except the one you want to hide
        if (stage != Stage.Stage4) {
            jsonGenerator.writeString(stage.name());
        }
    }
}

使用

@JsonSerialize
注释将此序列化器应用到您的 DTO 字段。

public class CustomStageDTO {
    @JsonSerialize(using = CustomStageSerializer.class)
    @Schema(allowableValues = {"Stage1", "Stage2", "Stage3"})
    private Stage stage;
}

现在在想要隐藏枚举值的控制器中使用此 DTO。

@RestController
@RequestMapping("/example")
public class ExampleController {

    @PostMapping("/custom-stage")
    public void postCustomStage(@RequestBody CustomStageDTO customStageDTO) {
    }
}

使用此方法将使 Swagger 识别

CustomStageDTO
中的枚举类型,并仅显示
@Schema
注释下拉列表中指定的值,并隐藏
Stage4

© www.soinside.com 2019 - 2024. All rights reserved.