使用 java 和 springdoc-openapi,我目前正在使用这样的枚举:
enum Stage {
Stage1, Stage2 Stage3, Stage4 etc..;
}
对于一个控制器,我想在 swagger UI 中显示所有值,首先作为显示选项的列表,然后是可供选择的下拉列表 - 这就是现在的工作情况。
对于另一个控制器,我想隐藏一个值。
这种行为可能吗?如果可能的话,如何实现?
我尝试使用带有自定义序列化器的 dto 来隐藏该值,但是 swagger ui 仅显示第一个值,作为没有下拉菜单的 json,可能是因为它无法识别 dto 持有枚举。
谢谢你
首先使用 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
。