Spring REST集成Swagger3后@Schema覆盖校验消息,能否禁用Swagger校验?
问题描述
我们在现有Spring REST应用中引入Swagger3后遇到了校验消息被覆盖的问题:
- 引入前:使用
javax.validation的@NotNull注解校验请求体,错误消息为XXX must not be null - 引入后:同时使用
@Schema(required = true)与@NotNull时,错误消息变为Missing required creator property 'XXX',Swagger的校验逻辑覆盖了javax.validation的输出。
请问是否可以禁用Swagger的校验功能?
解决方案
可以禁用Swagger的校验功能,以下是几种直接可行的方案:
方案1:移除@Schema(required = true)注解
Swagger的@Schema(required = true)是触发其内置校验的直接原因。如果你的校验逻辑完全依赖javax.validation的注解,直接去掉该注解即可,这样Swagger不会介入校验流程,错误消息会恢复为javax.validation生成的内容。
方案2:禁用Swagger的请求校验过滤器
Swagger通过RequestValidationFilter实现请求体校验,在Spring配置中禁用这个过滤器即可阻断Swagger的校验逻辑:
@Configuration public class SwaggerConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info().title("API文档").version("1.0")); } // 禁用Swagger请求校验过滤器 @Bean public FilterRegistrationBean<RequestValidationFilter> disableSwaggerValidationFilter() { FilterRegistrationBean<RequestValidationFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new RequestValidationFilter()); registrationBean.setEnabled(false); return registrationBean; } }
方案3:强制Spring使用javax.validation校验器
通过配置类指定Spring优先使用javax.validation的默认校验器,覆盖Swagger提供的校验组件:
@Configuration public class ValidationConfig { @Bean public Validator validator() { return Validation.buildDefaultValidatorFactory().getValidator(); } }
补充说明
Swagger3的核心定位是生成API文档,校验功能属于附加特性。禁用其校验逻辑不会影响API文档的生成,完全可以保留@Schema注解的其他属性(比如description、example等)来完善文档,只去掉required = true或者禁用校验过滤器即可。
内容的提问来源于stack exchange,提问作者sathees
相关产品推荐
相关产品推荐

