1

在使用 Hibernate Validator时,我注意到@NotEmpty@NotNull注释在.InvalidValuegetInvalidValues(...)

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

如果我不包含消息(例如单独包含消息@NotEmpty),那么我会得到两个 InvalidValue 副本,其中包含“可能不是 null 或空”的消息字段。

为什么 Hibernate Validator 会这样做?我不应该收到一条消息,要么是我使用参数覆盖的值,要么是默认消息,但不能同时收到两者?


有关更多上下文:

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

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


4

1 回答 1

1

贾斯汀,

在过去的几个月里,我一直在使用 Hibernate Validator。虽然我没有遇到您描述的相同问题,但我也没有扩展ClassValidator. 对于自定义验证,Hibernate 参考指南指出编写自定义约束是要走的路。

我已经能够几乎完全在我当前的项目中使用内置约束。在一种情况下,我需要对整数字段进行一些非常具体的计算,我编写了参考指南中描述的自定义约束;轻而易举。

谈到你的具体问题,我写了一个简单的测试应用程序作为我的一种健全性检查:

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

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

may not be null or empty
may not be null

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

我希望这是有帮助的。

布赖恩·T·格兰特

于 2009-06-30T15:02:39.863 回答