3

使用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次。

任何人都可以帮助我解决这种情况吗?这是一个错误?我如何解决它?

回答

2

你应该尝试使用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次?