按逻辑顺序执行JSR-303验证

时间:2017-02-24 19:50:59

标签: spring validation bean-validation

我的域模型类验证限制中有这样的字段:

@Column(nullable = false, name = "name")
    @NotEmpty(groups = {Envelope.Insert.class, Envelope.Update.class})
    @Size(min = 3, max = 32)
    private String name;

当此字段为空("")或为null时,验证器生成"不能为空"和"大小必须介于..."错误消息。我理解它,但当我向客户端显示此验证错误时,它似乎很奇怪(因为当某些东西为空/空时它无法满足大小要求,它不合逻辑。)

有没有办法告诉Spring按正确的顺序进行验证?如果不是@NotEmpty,则不要检查@Size,并且在@NotEmpty成功完成后,请检查@Size

2 个答案:

答案 0 :(得分:2)

根据Hibernate official document:

  

默认情况下,约束的评估顺序不是特定的   无论他们属于哪个群体。在某些情况下,   但是,控制约束的顺序很有用   评价。为了实现这样的订单,我们将定义一个新订单   接口并使用定义顺序的@GroupSequence对其进行注释   哪些小组必须经过验证。

首先,创建两个接口FirstOrder.class和SecondOrder.class,然后使用@GroupSequence注释在OrderedChecks.java中定义一个组序列。

public interface FirstOrder {
}

public interface SecondOrder {
}

@GroupSequence({FirstOrder.class, SecondOrder.class})
public interface OrderedChecks {
}

最后,在bean约束注释中添加组。

@Column(nullable = false, name = "name")
@NotEmpty(groups = {FirstOrder.class, Envelope.Insert.class, Envelope.Update.class})
@Size(min = 3, max = 32, groups=SecondOrder.class)
private String name;

答案 1 :(得分:1)

以下示例取自JSR-303 docs

public class Address {
    @NotEmpty(groups = Minimal.class)
    @Size(max=50, groups=FirstStep.class)
    private String street1;

    @NotEmpty(groups=SecondStep.class)
    private String city;

    @NotEmpty(groups = {Minimal.class, SecondStep.class})
    private String zipCode;
    ...

    public interface FirstStep {}

    public interface SecondStep {}

    @GroupSequence({Firststep.class, SecondStep.class})
    public interface Total {}
}

并像这样调用验证器

validator.validate(address, Minimal.class, Total.class);