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

Spring Webflux+OpenAPI3:Swagger UI参数配置问题咨询

Spring Webflux + springdoc-openapi v1.4.3 问题解决方案

1. 修复required参数的Swagger UI缺失提示问题

Webflux RouterFunction模式下,仅设置required=true无法被springdoc正确识别,需显式声明参数必填性:

方式一:Handler方法注解声明

在Handler的参数上添加@Parameter注解明确必填属性:

public Mono<ServerResponse> getById(
        @Parameter(required = true, description = "资源ID") @PathVariable String id,
        @Parameter(required = true, description = "授权令牌") @RequestHeader("Authorization") String authToken,
        ServerRequest request) {
    // 业务逻辑实现
}

方式二:RouterFunction中显式配置

通过withParameter方法直接在路由里定义参数规则:

@Bean
public RouterFunction<ServerResponse> userRoutes(UserHandler handler) {
    return RouterFunctions.route()
            .GET("/users/{id}", request -> handler.getById(
                    request.pathVariable("id"),
                    request.headers().firstHeader("Authorization"),
                    request))
            .withParameter("id", param -> param.required(true).description("资源ID"))
            .withParameter("Authorization", param -> param.required(true).description("授权令牌").in(ParameterIn.HEADER))
            .build();
}

同时确保springdoc配置类启用Webflux支持:

@Configuration
public class SpringDocConfig {
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("响应式API文档").version("v1"));
    }

    @Bean
    public RouterFunction<ServerResponse> springDocRouterFunction(OpenApiResource openApiResource) {
        return RouterFunctions.route(GET("/v3/api-docs"), openApiResource::openapi);
    }
}

2. 为id参数添加正则校验及提示

通过@Parameter的schema属性指定正则规则,同时补充描述说明校验要求:

Handler注解方式

public Mono<ServerResponse> getById(
        @Parameter(
                required = true,
                description = "资源ID,格式要求:5-15位字母或数字",
                schema = @Schema(pattern = "^[a-zA-Z0-9]{5,15}$", example = "abc123")
        ) @PathVariable String id,
        ServerRequest request) {
    // 业务逻辑实现
}

Router配置方式

@Bean
public RouterFunction<ServerResponse> userRoutes(UserHandler handler) {
    Schema schema = new Schema()
            .pattern("^[a-zA-Z0-9]{5,15}$")
            .description("资源ID,格式要求:5-15位字母或数字")
            .example("abc123");

    return RouterFunctions.route()
            .GET("/users/{id}", request -> handler.getById(request.pathVariable("id"), request))
            .withParameter("id", param -> param.required(true).schema(schema))
            .build();
}

若需后端校验,可结合@Pattern注解:

public Mono<ServerResponse> getById(
        @Parameter(required = true)
        @Pattern(regexp = "^[a-zA-Z0-9]{5,15}$", message = "ID格式错误,需为5-15位字母或数字")
        @PathVariable String id,
        ServerRequest request) {
    // 校验逻辑或使用Validator处理
}

3. 为参数添加枚举实现Swagger UI下拉框

先定义枚举类:

public enum UserStatus {
    ACTIVE("激活"),
    INACTIVE("禁用"),
    PENDING("待审核");

    private final String desc;

    UserStatus(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }
}

方式一:直接使用枚举作为参数类型

Handler方法参数设为枚举类型,springdoc会自动生成下拉框:

public Mono<ServerResponse> getByStatus(
        @Parameter(required = true, description = "用户状态") @RequestParam UserStatus status,
        ServerRequest request) {
    // 业务逻辑实现
}

方式二:Router中显式绑定枚举

若参数为String类型,需在路由配置里指定schema的枚举实现:

@Bean
public RouterFunction<ServerResponse> userRoutes(UserHandler handler) {
    Schema schema = new Schema()
            .implementation(UserStatus.class)
            .description("用户状态");

    return RouterFunctions.route()
            .GET("/users/status", request -> handler.getByStatus(
                    UserStatus.valueOf(request.queryParam("status").get()),
                    request))
            .withParameter("status", param -> param.required(true).schema(schema))
            .build();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:55:34