【问题标题】:Custom bean validation does not `@inject` CDI beans and does not interpolate message?自定义 bean 验证不 `@inject` CDI bean 并且不插入消息?
【发布时间】:2013-12-08 08:02:57
【问题描述】:

我正在使用带有 bean 验证的 GF4。我正在尝试在我的自定义验证器中 @Inject 一个服务 bean,但我得到了一个 null 值。

 public class TestValidator implements ConstraintValidator<>{
   @Inject Service myService;
}

这不是假设与 JEE7 一起工作吗?

另外,我正在尝试找到内置的动态消息插值(不写我自己的MessageInterpolator)。我确实看到了一些例子,但它们不是很清楚。我正在寻找的是从ConstraintValidator.isValid 传递动态参数。例如:

Message_test={value} 无效

并以某种方式编织它,就像您可以静态插入 Annotation 值一样,例如size_msg={min}-{max} 超出范围。

【问题讨论】:

    标签: cdi bean-validation glassfish-4 java-ee-7


    【解决方案1】:

    是的,Java EE 7 / Bean Validation 1.1 通常应该可以将依赖项注入到验证器中。

    您如何执行验证以及如何获取Validator 对象?请注意,默认情况下 DI 仅适用于容器管理的验证器,即您通过 @Inject 或 JNDI 查找检索的验证器。如果您使用 BV 引导 API 自己引导验证器,则该验证器不会启用 CDI。

    关于消息插值,您可以使用${validatedValue} 引用验证值。如果您使用的是 Hibernate Validator 5.1.0.Alpha1 或更高版本,那么您还可以使用 the possibilityConstraintValidator#isValid() 中向消息上下文添加更多对象,如下所示:

    public boolean isValid(Date value, ConstraintValidatorContext context) {
        Date now = GregorianCalendar.getInstance().getTime();
    
        if ( value.before( now ) ) {
            HibernateConstraintValidatorContext hibernateContext =
                    context.unwrap( HibernateConstraintValidatorContext.class );
    
            hibernateContext.disableDefaultConstraintViolation();
            hibernateContext.addExpressionVariable( "now", now )
                    .buildConstraintViolationWithTemplate( "Must be after ${now}" )
                    .addConstraintViolation();
    
            return false;
        }
    
        return true;
    }
    

    【讨论】:

    • 感谢您的回答。我正在使用@Named @ApplicationScoped 来定义我的服务。验证是通过 JSF 2.2 触发的,所以我假设它将通过 CDI 加载。在我的验证器中,我使用@Inject 来引用我的服务bean。就休眠而言,我不想将我的应用程序与任何实现结合起来。
    • 我设法解决了这个问题。如果在 JSF bean 上设置了 Validation 注释,则服务被正确注入。如果在 JPA bean 上设置了验证注释,那么它不是。我认为这是正常的,因为服务被定义为@Named/@ApplicationScoped,因此它们在休眠 CDI 上下文中不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2011-05-07
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多