在使用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()
的调用都包含重复的消息,一个与传递给注释的消息属性匹配,另一个消息与注释消息的库存值匹配。
答案 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