我有很多类在类字段上定义了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 ,
...}
谢谢并希望得到你的帮助。
答案 0 :(得分:1)
简短的回答是您需要更新您的模型: - )
在运行时无法更改访问类型。您引用的元数据API(通过BeanDescriptor)是只读数据结构。您无法使用它来更改或配置现有约束。即使您可以通过某种方式使其工作,它也可能随时中断,因为您将依赖于某些实现细节,这些细节甚至可能会在Validator的次要版本更改之间发生变化。
还要考虑软件的进一步发展。其他必须维护或增强软件的人将看到对该字段的约束,因此假设使用字段访问。
我认为你最好的选择是移动约束。