Spring Boot 2.4中MultipartFile自定义校验器未生效的解决方法
解决Spring Boot 2.4中MultipartFile自定义校验器不生效的问题
问题描述
使用Spring Boot 2.4开发时,控制器方法接收MultipartFile参数,编写了自定义校验注解@MultipartFileConstraint和对应的校验器MultipartFileValidator,但调用接口时校验器未执行(无日志输出、断点未触发)。
控制器核心代码:
@RestController public class MyController extends AbstractController { ... @Override public ResponseEntity<ResponseData> add( ... @Parameter(description = "file detail") @Validated @RequestPart("myFile") MultipartFile myFile, ... ) { // 业务逻辑 } }
自定义校验注解:
@Documented @Constraint(validatedBy = MultipartFileValidator.class) @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MultipartFileConstraint { String message() default "Incorrect file type."; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
校验器实现类:
public class MultipartFileValidator implements ConstraintValidator<MultipartFileConstraint, MultipartFile> { @Override public void initialize(final MultipartFileConstraint constraintAnnotation) { log.info("\n\n\n\nconstructor called\n\n\n\n"); } @Override public boolean isValid( MultipartFile file, ConstraintValidatorContext constraintValidatorContext) { log.info("Validating file"); // 校验逻辑 ... } }
解决步骤
1. 为MultipartFile参数添加自定义校验注解
需要在MultipartFile参数上显式标注@MultipartFileConstraint,告诉Spring要使用这个自定义校验规则。修改后的控制器参数代码:
@Parameter(description = "file detail") @Validated @RequestPart("myFile") @MultipartFileConstraint // 添加自定义校验注解 MultipartFile myFile
2. 在控制器类上添加@Validated注解
Spring Boot需要通过@Validated启用控制器的方法参数校验机制,将该注解添加到控制器类上:
@RestController @Validated // 启用方法参数校验 public class MyController extends AbstractController { // ... 方法实现 }
3. 确保校验器被Spring容器管理
将MultipartFileValidator类添加@Component注解,让Spring能够扫描并管理这个校验器Bean:
@Component // 添加该注解 public class MultipartFileValidator implements ConstraintValidator<MultipartFileConstraint, MultipartFile> { // ... 校验逻辑实现 }
4. 验证请求格式和参数名匹配
确保请求的Content-Type为multipart/form-data,并且上传文件的参数名与@RequestPart("myFile")中的myFile完全一致,否则参数绑定失败会导致校验逻辑无法触发。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

