在方法中使用@AssertTrue时,在验证过程中调用该方法4次(Bean Validation)
问题描述:
使用bean验证来验证对象的状态时,每当调用验证时,用@AssertTrue
注释的方法被调用4次。每次调用只能调用一次。在方法中使用@AssertTrue时,在验证过程中调用该方法4次(Bean Validation)
休眠验证器版本:5.1.3.Final
下面是一个例子:
对于下面的类摩托车:
import javax.validation.constraints.AssertTrue;
class Motorcycle{
private int fuel;
private int tireDurability;
@AssertTrue(message = "motorcycle.not.available.to.use")
public boolean isAvailable(){
return fuel > 0 && tireDurability > 0;
}
public void toUse(){...}
}
和主:
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class Main{
public static void main(String []args){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Motorcycle>> violations = validator.validate(new Motorcycle());
}
}
当validator.validate(new Motorcycle())
是c alled,方法isAvailable()
被调用4次。
任何人都可以帮助我解决这种情况吗?这是一个错误?我如何解决它?
答
你应该尝试使用Hibernate Validator 6.0.2.Final(它是目前最新的可用版本)。接下来测试并通过与验证的这个(最新的)版本:
@Test
public void testMotorcycle() throws Exception {
AtomicInteger count = new AtomicInteger(0);
Motorcycle motorcycle = new Motorcycle(count);
validator.validate(motorcycle);
assertEquals(motorcycle.count.get(), 1);
}
class Motorcycle {
final AtomicInteger count;
private int fuel;
private int tireDurability;
Motorcycle(AtomicInteger count) {
this.count = count;
}
@AssertTrue(message = "motorcycle.not.available.to.use")
public boolean isAvailable() {
count.incrementAndGet();
return fuel > 0 && tireDurability > 0;
}
}
我曾尝试与5.1运行以及 - 它也经过那里。你怎么确定这个方法被称为4次?