如何在运行时更改注释/ Hibernate验证规则?

时间:2009-04-15 09:15:57

标签: java annotations runtime hibernate-validator

如果有一个带有某些字段的Java类,我想使用Hibernate Validator进行验证。 现在我希望我的用户能够在运行时配置哪些验证。

例如:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

假设我想删除NotEmpty支票或将其替换为EmailCreditCardNumber,我该怎么办?它甚至可能吗?我想它归结为在运行时改变注释......

3 个答案:

答案 0 :(得分:3)

你不能正常做到。

以下是我通过Hibernate Validator进行更多动态验证所做的工作。

  1. 扩展ClassValidator类。
  2. 覆盖getInvalidVaues(Object myObj)方法。首先,调用super.getInvalidValues(myObj),然后将钩子添加到自定义验证中。
  3. 实例化自定义验证程序并调用getInvalidValues进行验证。任何休眠注释验证都将在此时启动,您的自定义动态验证(注释不支持的任何内容)也将启动。
  4. 示例:

    public class MyObjectValidator extends ClassValidator<MyObject>
    {
        public MyObjectValidator()
        {
             super(MyObject.class);
        }
    
        public InvalidValue[] getInvalidValues(MyObject myObj)
        {
            List<InvalidValue> invalids = new ArrayList<InvalidValue>();
            invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));
    
            // add custom validations here
            invalids.addAll(validateDynamicStuff(myObj));
    
            InvalidValue[] results = new InvalidValue[invalids.size()];
            return invalids.toArray(results);
        }
    
        private List<InvalidValue> validateDynamicStuff(MyObject myObj)
        {
            // ... whatever validations you want ...
        }
    
    }
    

    因此,您的自定义验证代码可以包含“执行此验证,如果用户配置它,否则执行该操作”等逻辑,等等。您可能会也可能无法利用支持hibernate验证的相同代码,但是无论哪种方式,你正在做的事情更多地涉及到hibernate验证器的“正常”用例。

答案 1 :(得分:1)

实际上它可以在hibernate验证器4.1中实现。请阅读有关programatic constraint creation

的文档

答案 2 :(得分:0)

我认为你不能删除或更改注释,它是类定义的一部分。您可以构建一个新类,这可以在运行时进行,但有一点涉及。 Hibernate可能支持以编程方式访问验证并允许您覆盖注释,我不太了解API。 Hibernate会自行构建一些运行时类...如果你感兴趣的话,这可能是学习如何操作的好地方。