如何在运行时更改注释/Hibernate 验证规则?
-
09-09-2019 - |
题
如果有一个带有某些字段的 Java 类,我想使用 Hibernate Validator 进行验证。现在我希望我的用户能够在运行时配置进行哪些验证。
例如:
public class MyPojo {
...
@NotEmpty
String void getMyField() {
...
}
...
}
假设我想删除 NotEmpty
检查或替换为 Email
或者 CreditCardNumber
, , 我该怎么做?有可能吗?我想这归结为在运行时更改注释......
解决方案
正常情况下你是做不到的。
以下是我通过 Hibernate Validator 获得更多动态验证所做的工作。
- 延长
ClassValidator
班级。 - 覆盖
getInvalidVaues(Object myObj)
方法。首先,打电话super.getInvalidValues(myObj)
, ,然后将挂钩添加到您的自定义验证中。 - 实例化您的自定义验证器并调用
getInvalidValues
验证。任何休眠注释验证都将在此时启动,并且您的自定义动态验证(注释不支持的任何内容)也将启动。
例子:
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 ...
}
}
因此,您的自定义验证代码可以包含诸如“如果用户配置了此验证,则执行此验证,否则执行该验证”等逻辑。您可能能够也可能无法利用支持休眠验证的相同代码,但无论哪种方式,您所做的事情都比休眠验证器的“正常”用例更加复杂。
其他提示
实际上有可能在休眠验证器4.1。刚刚看了一下程序上的约束创建的文档一>
我不认为你就可以删除或更改注释,它是类定义的一部分。你可以建立一个新的类,它可以在运行时,但有点复杂。休眠可支持到验证程序的访问,并允许您覆盖批注,我不知道该API那么好。 Hibernate的确实有点运行时类建筑本身的......这可能是学习如何做,如果你有兴趣的好地方。
不隶属于 StackOverflow