我使用spring来验证表单。表单的模型类似于:
public class FormModel {
@NotBlank
private String name;
@NotNull
@ImageSizeConstraint
private MultipartFile image;
}
' @ ImageSizeConstraint'是一个自定义约束。我想要的是首先评估@NotNull,如果评估为false,则不评估@ImageSizeConstraint。
如果无法做到这一点,我也必须在自定义约束中检查null。这不是问题,但我想分开关注点(不是null / image size / image / aspectratio / etc)。
答案 0 :(得分:2)
您可以使用约束分组和组序列来定义验证顺序。根据{{3}}(部分 3.5。验证例程):
除非按组序列排序,否则可以在组中验证组 特别的顺序。这意味着可以运行验证例程 对于同一通行证中的几个小组。
正如Hibernate Validator JSR-303所说:
为了实现这样的验证顺序,您只需要定义 接口并使用@GroupSequence注释它,定义顺序 其中必须验证组(请参阅定义组 序列)。如果序列组中至少有一个约束失败,则为none 序列get中以下组的约束条件 验证
首先,您必须定义约束组并将其应用于约束:
public interface CheckItFirst {}
public interface ThenCheckIt {}
public class FormModel {
@NotBlank
private String name;
@NotNull(groups = CheckItFirst.class)
@ImageSizeConstraint(groups = ThenCheckIt.class)
private MultipartFile image;
}
然后,由于约束的评估没有特定顺序,无论它们属于哪个组(Default
组),您都必须为image
字段约束创建documentation基团。
@GroupSequence({ CheckItFirst.class, ThenCheckIt.class })
public interface OrderedChecks {}
您可以使用
进行测试Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<FormModel>> constraintViolations =
validator.validate(formModel, OrderedChecks.class);
要在Spring MVC Controller方法中应用此验证,您可以使用@GroupSequence注释,它可以指定方法级验证的验证组:
@PostMapping(value = "/processFormModel")
public String processFormModel(@Validated(OrderedChecks.class) FormModel formModel) {
<...>
}
答案 1 :(得分:1)
如果您的自定义约束的图像为null,则只需对isValid返回true。 阅读JSR-303的规范,你会发现这是正常的行为,因为有“NotNull”这是有道理的。