多重约束弹簧验证

时间:2017-10-02 11:23:53

标签: java spring-validator

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

public class FormModel {

    @NotBlank
    private String name;

    @NotNull
    @ImageSizeConstraint
    private MultipartFile image;

}

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

如果无法做到这一点,我也必须在自定义约束中检查null。这不是问题,但我想分开关注点(不是null / image size / image / aspectratio / etc)。

2 个答案:

答案 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”这是有道理的。