0

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

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

我的问题是没有设置方法来改变当前的约束。当我调试代码时,我发现只有两点应该更改以将约束移动到 getter 访问,但我不知道该怎么做。

{MetaConstraint{constraintType=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,

...}

谢谢并希望您的帮助。

4

1 回答 1

1

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

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

还要考虑软件的进一步发展。必须维护或增强软件的其他人会看到对字段施加的限制,因此假设使用了字段访问。

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

于 2013-06-19T09:21:41.017 回答