在运行时将验证约束从属性移动到方法(JSR 303)

时间:2013-06-18 09:42:31

标签: hibernate bean-validation hibernate-validator

我有很多类在类字段上定义了JSR 303验证注释。由于我们使用ORM和延迟加载这一事实存在应该在getter而不是字段(ORM integration)上定义约束的问题。

我不想花时间修改整个模型定义。所以我的想法是在运行时移动约束。我发现约束定义可以通过BeanDescriptor获得example。我可以访问我在场级别定义的所有约束。

我的问题是没有setter方法,用于改变当前的约束。当我调试代码时,我发现只应更改两个点以将约束移动到getter访问,但我不知道如何去做。

{MetaConstraint {约束类型= javax.validation.constraints.NotNull, location = BeanConstraintLocation {beanClass = ServiceAddress, propertyName ='isVirtual'}} = java.lang.Object@56811df,

MetaConstraint {constraintType = org.hibernate.validator.constraints.NotEmpty,location = BeanConstraintLocation {beanClass = ServiceAddress, propertyName ='postalCode'}} = java.lang.Object@56811df ,

MetaConstraint {constraintType = org.hibernate.validator.constraints.NotEmpty,location = BeanConstraintLocation {beanClass = ServiceAddress, propertyName ='code'}} = java.lang.Object@56811df ,

...}

谢谢并希望得到你的帮助。

1 个答案:

答案 0 :(得分:1)

简短的回答是您需要更新您的模型: - )

在运行时无法更改访问类型。您引用的元数据API(通过BeanDescriptor)是只读数据结构。您无法使用它来更改或配置现有约束。即使您可以通过某种方式使其工作,它也可能随时中断,因为您将依赖于某些实现细节,这些细节甚至可能会在Validator的次要版本更改之间发生变化。

还要考虑软件的进一步发展。其他必须维护或增强软件的人将看到对该字段的约束,因此假设使用字段访问。

我认为你最好的选择是移动约束。