You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于springdoc-openapi在Java不同控制器中隐藏枚举值

需求可行,以下是几种实现方式:

方式一:通过@Schema注解直接指定允许值(快速实现)

针对单个接口或DTO字段,直接在枚举参数/字段上添加@Schema注解,明确指定允许展示的枚举值,Swagger UI会自动生成对应的下拉选项:

// 示例DTO
public class StageRequest {
    // 只展示Stage1、Stage2、Stage4,隐藏Stage3
    @Schema(allowableValues = {"Stage1", "Stage2", "Stage4"})
    private Stage stage;

    // getter/setter
}

// 控制器接口
@PostMapping("/api/stage")
public ResponseEntity<Void> submitStage(@RequestBody StageRequest request) {
    // 业务逻辑
    return ResponseEntity.ok().build();
}

这种方式不需要修改原有枚举类,仅针对需要隐藏值的场景单独配置,同时不影响其他接口对完整枚举的使用。

方式二:自定义SchemaFilter(全局批量配置)

如果多个接口需要统一隐藏某个枚举值,可实现SchemaFilter接口来全局过滤枚举值:

import io.swagger.v3.oas.models.media.Schema;
import org.springdoc.core.customizers.SchemaFilter;

public class StageEnumFilter implements SchemaFilter {
    @Override
    public void filter(Schema schema, SchemaFilterContext context) {
        // 判断当前处理的是Stage枚举类
        if (context.getType().equals(Stage.class)) {
            // 移除需要隐藏的Stage3
            schema.getEnum().remove("Stage3");
        }
    }
}

然后在Spring配置类中注册这个过滤器:

import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringDocConfig {
    @Bean
    public OpenApiCustomiser openApiCustomiser() {
        return openApi -> openApi.getComponents().getSchemas().values().forEach(schema -> {
            new StageEnumFilter().filter(schema, null);
        });
    }
}

注意:如果需要针对特定接口生效,可在Filter中额外判断请求路径或控制器类信息。

修复你之前的DTO+自定义序列化方案

你之前的问题出在只做了序列化处理,但未同步配置Swagger的枚举元数据,需要同时配合@Schema注解指定允许值:

// 自定义序列化器(仅序列化允许的枚举值)
public class StageSerializer extends StdSerializer<Stage> {
    private static final Set<Stage> ALLOWED_STAGES = Set.of(Stage.Stage1, Stage.Stage2, Stage.Stage4);

    public StageSerializer() {
        super(Stage.class);
    }

    @Override
    public void serialize(Stage value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (ALLOWED_STAGES.contains(value)) {
            gen.writeString(value.name());
        } else {
            // 可抛出异常或返回默认值,根据业务需求处理
            throw new IllegalArgumentException("Invalid stage value");
        }
    }
}

// DTO中同时配置序列化和Swagger注解
public class RestrictedStageRequest {
    @JsonSerialize(using = StageSerializer.class)
    @Schema(allowableValues = {"Stage1", "Stage2", "Stage4"})
    private Stage stage;

    // getter/setter
}

这样既保证了接口只接受允许的枚举值,也能让Swagger UI正确识别枚举类型并生成下拉选择器。


内容的提问来源于stack exchange,提问作者Itamarled

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:18:18