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

Spring Swagger如何为自定义MyDate类型所有字段自动添加pattern规则

Swagger全局为自定义MyDate类型添加pattern规则方案

你可以通过扩展Springfox的自定义插件实现全局自动给所有MyDate类型字段添加pattern规则,无需修改业务代码里的单个字段注解,具体实现步骤如下:

  1. 保留原有directModelSubstitute配置,新增两类自定义插件:
    • ModelPropertyBuilderPlugin:处理实体类中MyDate类型的字段属性
    • ParameterBuilderPlugin:处理接口方法中直接声明的MyDate类型入参

完整配置代码示例:

import com.fasterxml.classmate.ResolvedType;
import com.google.common.base.Optional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ModelPropertyBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin;
import springfox.documentation.spi.schema.contexts.ModelPropertyContext;
import springfox.documentation.spi.service.ParameterBuilderPlugin;
import springfox.documentation.spi.service.contexts.ParameterContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static springfox.documentation.builders.PathSelectors.any;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    // 替换为你实际需要的日期格式正则,示例为yyyy-MM-dd格式
    private static final String MY_DATE_PATTERN = "^\\d{4}-\\d{2}-\\d{2}$";
    private static final String MY_DATE_EXAMPLE = "2024-05-20";

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 保留原有类型替换配置
                .directModelSubstitute(MyDate.class, String.class)
                .select()
                .apis(RequestHandlerSelectors.basePackage("替换为你的业务接口包路径"))
                .paths(any())
                .build();
    }

    /**
     * 处理实体类中的MyDate类型字段
     */
    @Bean
    public ModelPropertyBuilderPlugin myDatePropertyPlugin() {
        return new ModelPropertyBuilderPlugin() {
            @Override
            public boolean supports(DocumentationType documentationType) {
                return DocumentationType.SWAGGER_2.equals(documentationType);
            }

            @Override
            public void apply(ModelPropertyContext context) {
                Optional<ResolvedType> typeOpt = context.getResolvedType();
                if (typeOpt.isPresent() && MyDate.class.isAssignableFrom(typeOpt.get().getErasedType())) {
                    ModelPropertyBuilder builder = context.getBuilder();
                    builder.pattern(MY_DATE_PATTERN)
                            .example(MY_DATE_EXAMPLE);
                }
            }
        };
    }

    /**
     * 处理接口方法直接入参的MyDate类型
     */
    @Bean
    public ParameterBuilderPlugin myDateParameterPlugin() {
        return new ParameterBuilderPlugin() {
            @Override
            public boolean supports(DocumentationType documentationType) {
                return DocumentationType.SWAGGER_2.equals(documentationType);
            }

            @Override
            public void apply(ParameterContext context) {
                ResolvedType paramType = context.resolvedMethodParameter().getParameterType();
                if (MyDate.class.isAssignableFrom(paramType.getErasedType())) {
                    ParameterBuilder builder = context.parameterBuilder();
                    builder.pattern(MY_DATE_PATTERN)
                            .example(MY_DATE_EXAMPLE);
                }
            }
        };
    }
}

生效验证

配置完成后重启服务,所有MyDate类型对应的字符串字段都会自动在Swagger文档中展示pattern规则和示例值,无需额外修改业务代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:45:05