此规则会标记是否使用了 javax.validation.Validation.buildDefaultValidatorFactory() 或 Validation.byDefaultProvider().configure().buildValidatorFactory()。 Liberty beanValidation-1.0 和 beanValidation-1.1 实现由 Apache Bean Validation 提供。在 Java EE 8 中,Liberty 功能部件 beanValidation-2.0 所提供的 Bean Validation 实现已更改为 Hibernate Validator。Apache Bean Validation 实现要求应用程序创建非受管 ValidatorFactory 对象,并且 ConstraintValidatorFactory 返回 CDI 受管 ConstraintValidator 实例。但是,Hibernate Validator 仅支持使用服务器运行时所提供的缺省 ValidatorFactory 来生成 CDI 受管 ConstraintValidator 对象。可以通过使用 @Resource、 @Inject 或者直接 JNDI 查询来获得此服务器受管 ValidatorFactory。
使用 javax.validation.Validation.buildDefaultValidatorFactory() 或 Validation.byDefaultProvider().configure().buildValidatorFactory() 时,应用程序可能会发现行为发生更改。请注意,在调用 buildValidatorFactory() 之前, 可能会调用其他定制方法,例如 messageInterpolator()、 traversableResolver()、 parameterNameProvider() 或者 constraintValidatorFactory()。
总之,期望 ConstraintValidatorFactory 所返回的对象是 CDI 受管对象的用户将需要对其现有 Bean Validation 代码实现更改。
以下代码是应重构的 Bean Validation 用法的示例:
//Original application behavior
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(messageResourceInterpolator).buildValidatorFactory().getValidator();
|
以下代码显示针对问题代码的修订:
//Recommended application behavior (potential quick fix)
@Inject //@Resource or a jndi lookup of java:comp/ValidatorFactory could also be used to obtain the container's default ValidatorFactory
ValidatorFactory validatorFactory;
Validator validator = validatorFactory.usingContext().messageInterpolator(messageResourceInterpolator).getValidator();
|
有关在 WebSphere Liberty 中配置验证的更多信息,请参阅 Bean Validation 2.0 文档。