为什么Hibernate Validator @NotEmpty会产生重复的消息?

时间:2009-04-23 12:42:46

标签: hibernate-validator

在使用Hibernate Validator时,我注意到@NotEmpty@NotNull注释会在InvalidValue返回的getInvalidValues(...)数组中产生重复的消息。

如果我指定了@NotEmpty(message = "My error message.")之类的消息,那么我将获得一个InvalidValue“我的错误消息”。和第二个“可能不是空或空”

如果我没有包含消息(例如@NotEmpty本身),那么我会得到两个InvalidValue副本,消息字段为“可能不为空或空”。

为什么Hibernate Validator会这样做?我不应该得到一条消息,无论是使用参数覆盖的值,还是默认消息,但不是两者都是?


更多内容:

我正在使用自己的ClassValidator<T>实施扩展ClassValidator<MyClass>。我这样做是为了添加一些自定义验证,这是注释无法完成的。我需要查看类的多个属性的运行时值以确定验证。

当我调用myClassValidator.getInvalidValues()时,我得到了验证,我覆盖了它。在getInvalidValues()的实现中,我调用super.getInvalidValues()来创建初始错误列表,然后将自定义错误添加到该列表中。在任何情况下,对super.getInvalidValues()的调用都包含重复的消息,一个与传递给注释的消息属性匹配,另一个消息与注释消息的库存值匹配。


1 个答案:

答案 0 :(得分:1)

贾斯汀,

在过去的几个月里,我一直在使用Hibernate Validator。虽然我没有遇到您所描述的相同问题,但我还没有延长ClassValidator。对于自定义验证,Hibernate Reference Guide表示编写自定义约束是可行的方法。

我几乎可以在我当前的项目中使用内置约束。在一种情况下,我需要对整数字段进行一些非常具体的计算,我写了一个自定义约束,如参考指南中所述;这是一件轻而易举的事。

根据您的具体问题,我写了一个简单的测试应用程序,作为我的一种理智检查:

import org.hibernate.validator.*;

public class HibernateValidatorTest {
    @NotEmpty
    @NotNull
    private String validateMe;

    public static void main ( String[] args ) {
        ClassValidator<HibernateValidatorTest> validator = 
            new ClassValidator<HibernateValidatorTest>( HibernateValidatorTest.class ); 

        InvalidValue[] inVals = 
            validator.getInvalidValues( new HibernateValidatorTest() );

        for ( InvalidValue inVal : inVals ) {
            System.out.println( inVal.getMessage() );
        }
    }
}

validateMe字段的两个Hibernate约束,控制台输出为:

may not be null or empty
may not be null

删除一个或另一个具有仅向控制台打印一条消息的预期效果。

我希望这有用。

Brian T. Grant