在方法中使用@AssertTrue时,该方法在验证期间被调用4次(Bean Validation)

Hen*_*ano 6 java validation custom-validators hibernate-validator bean-validation

@AssertTrue当使用bean验证来验证对象的状态时,每当调用验证时,使用注释的方法就会被调用4次。每次调用只应调用一次。

Hibernate 验证器版本: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(){...}
}
Run Code Online (Sandbox Code Playgroud)

以及主要的:

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());

    }
}
Run Code Online (Sandbox Code Playgroud)

validator.validate(new Motorcycle())调用时,该方法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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我也尝试用 5.1 运行它 - 并且它也通过了那里。您如何确定该方法被调用了 4 次?