多重约束弹簧验证

Rob*_*pek 5 java spring-validator

我正在使用 spring 来验证表单。表单的模型类似于:

public class FormModel {

    @NotBlank
    private String name;

    @NotNull
    @ImageSizeConstraint
    private MultipartFile image;

}
Run Code Online (Sandbox Code Playgroud)

'@ImageSizeConstraint' 是一个自定义约束。我想要的是首先评估@NotNull,如果评估结果为false,则不评估@ImageSizeConstraint。

如果这是不可能的,我还必须检查自定义约束中的 null。这不是问题,但我想分开关注(不是空/图像大小/图像/纵横比/等)。

Ana*_*mov 5

您可以使用约束分组和分组序列来定义验证顺序。根据JSR-303(第3.5部分。验证例程):

除非按组序列排序,否则不能按特定顺序验证组。这意味着可以在同一遍中为多个组运行验证例程。

正如 Hibernate Validator文档所说:

为了实现这样的验证顺序,您只需要定义一个接口并使用@GroupSequence 对其进行注释,定义必须验证组的顺序(请参阅定义组序列)。如果序列组中至少有一个约束失败,则序列中以下组的任何约束都不会得到验证。

首先,您必须定义约束组并将它们应用于约束:

public interface CheckItFirst {}

public interface ThenCheckIt {}

public class FormModel {

    @NotBlank
    private String name;

    @NotNull(groups = CheckItFirst.class)
    @ImageSizeConstraint(groups = ThenCheckIt.class)
    private MultipartFile image;
}
Run Code Online (Sandbox Code Playgroud)

然后,由于约束的评估没有特定的顺序,无论它们属于哪个组(Default组也是如此),您必须为字段约束组创建@GroupSequenceimage。

@GroupSequence({ CheckItFirst.class, ThenCheckIt.class })
public interface OrderedChecks {}
Run Code Online (Sandbox Code Playgroud)

你可以用

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<FormModel>> constraintViolations =
                            validator.validate(formModel, OrderedChecks.class);
Run Code Online (Sandbox Code Playgroud)

要在 Spring MVC Controller 方法中应用此验证,您可以使用@Validated批注,它可以为方法级验证指定验证组:

@PostMapping(value = "/processFormModel")
public String processFormModel(@Validated(OrderedChecks.class) FormModel formModel) {
    <...>
}
Run Code Online (Sandbox Code Playgroud)