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。这不是问题,但我想分开关注(不是空/图像大小/图像/纵横比/等)。
您可以使用约束分组和分组序列来定义验证顺序。根据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)
| 归档时间: |
|
| 查看次数: |
4958 次 |
| 最近记录: |