我的域模型类验证限制中有这样的字段:
@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
。
答案 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);