bounty将在3天后过期。回答此问题可获得+300的声誉奖励。Dave正在寻找来自声誉良好来源的答案。
我使用的是Sping Boot 2.4,我有以下控制器,其中的方法接受MultipartFile对象。
@RestController
public class MyController extends AbstractController
...
@Override
public ResponseEntity<ResponseData> add(
...
@Parameter(description = "file detail") @Validated @RequestPart("myFile")
MultipartFile myFile,
...
) {
我想验证这个MultipartFile包含我想要的数据(例如,是一个特定的mime类型)。所以我写了下面的验证器...
@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");
...
}
}
然而,当我调用端点时,我没有看到验证器被调用(例如,日志语句不会被打印,断点也不会被命中)。我还需要做什么来为这个MultipartFile参数注册验证器?
2条答案
按热度按时间kq4fsx7k1#
根据Spring Documentation:
也可以用于方法级别验证,指示特定类应该在方法级别验证(充当相应验证拦截器的切入点),但也可以选择指定带注解类中方法级别验证的验证组。
在方法级别应用这个注解允许覆盖特定方法的验证组,但不作为切入点;类级注解仍然是触发以开始的特定bean的方法验证所必需的。也可以用作自定义构造型注解或自定义组特定验证注解上的元注解。
所以,在这里我们必须记住什么是@Validated和验证器注解的位置.代码:
控制器类:@Validated在类级别添加,@ValidFile(自定义验证器注解)在方法中添加
验证器注解
验证器类
输出:成功:
异常处理程序
失败:
uujelgoq2#
下面是一个小例子,希望对大家有所帮助。