2017-02-24 73 views
0

JSR-303验证我有这样字段在我的域模型类验证约束:否则在逻辑顺序

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

当该字段为空(“”)或空时,验证器既产生“不能为空”和“大小必须在......之间”错误消息。我明白了,但是当我向客户端显示这个验证错误时,似乎很奇怪(因为当某些东西为空/空时它不能满足大小要求,这不是合乎逻辑的)。

有没有办法告诉Spring按照正确的顺序进行验证?如果不是@NotEmpty则不检查@Size,并且@NotEmpty满足时检查@Size

回答

1

根据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; 
0

下面的例子是从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); 
验证