此规则会标记是否使用了 javax.validation.Validation.buildDefaultValidatorFactory() 或 Validation.byDefaultProvider().configure().buildValidatorFactory() 我不知道 Liberty beanValidation-1.0 和 beanValidation-1.1 实现由 Apache Bean 验证提供。 在 Java EE 8 中,由 Liberty 功能部件提供的 Bean 验证实现 beanValidation-2.0 已更改为 Hibernate Validator。 Apache Bean Validation 实现要求应用程序创建非受管 ValidatorFactory 对象,并且 ConstraintValidatorFactory 返回 CDI 受管 ConstraintValidator 实例。 但是,Hibernate Validator 仅支持使用服务器运行时所提供的缺省 ValidatorFactory 来生成 CDI 受管 ConstraintValidator 对象。 此服务器管理的 ValidatorFactory 可通过使用 @Resource , @Inject 或直接 JNDI 查找。
应用程序在使用时可能会看到行为更改 javax.validation.Validation.buildDefaultValidatorFactory() 或 Validation.byDefaultProvider().configure().buildValidatorFactory() . 注意之前可能调用其他定制方法 buildValidatorFactory() 调用,例如 messageInterpolator() , traversableResolver() , parameterNameProvider() ,或 constraintValidatorFactory() .
总之,期望对象返回的用户 ConstraintValidatorFactory 要受 CDI 管理,将需要对其现有 Bean 验证代码实施更改。
以下代码是应重构的 Bean Validation 用法的示例:
//Original application behavior
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(messageResourceInterpolator).buildValidatorFactory().getValidator();
以下代码显示针对问题代码的修订:
//Recommended application behavior (potential Automated 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 文档。