Spring Swagger如何为自定义MyDate类型所有字段自动添加pattern规则
Swagger全局为自定义MyDate类型添加pattern规则方案
你可以通过扩展Springfox的自定义插件实现全局自动给所有MyDate类型字段添加pattern规则,无需修改业务代码里的单个字段注解,具体实现步骤如下:
- 保留原有
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
相关产品推荐
相关产品推荐

