【问题标题】:When using @AssertTrue in methods, the method is invoked 4 times during validation (Bean Validation)在方法中使用@AssertTrue 时,方法在验证期间被调用4 次(Bean Validation)
【发布时间】:2018-02-09 21:04:11
【问题描述】:

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

Hibernate-validator 版本: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())被调用时,方法isAvailable()被调用4次。

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

【问题讨论】:

    标签: java validation bean-validation hibernate-validator custom-validators


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2016-09-05
      • 2012-12-18
      相关资源
      最近更新 更多