JSR 303 bean验证,扩展的ConstraintValidator不能使用CDI

时间:2012-04-11 05:41:38

标签: jsf-2 cdi bean-validation

我尝试在类级别学习带有bean验证的JSF 2.0,如下所示: -

实用程序

@Singleton
public class MyUtility {
    public boolean isValid(final String input) {
       return (input != null) || (!input.trim().equals(""));
    }
}

约束注释

@Retention(RetentionPolicy.RUNTIME)
@Target({
    ElementType.TYPE,
    ElementType.ANNOTATION_TYPE,
    ElementType.FIELD
    })
@Constraint(validatedBy = Validator.class)
@Documented
public @interface Validatable {
    String  message() default "Validation is failure";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

约束验证器

public class Validator extends ConstraintValidator<Validatable, MyBean> {
    //
    //----> Try to inject the utility, but it cannot as null.
    //
    @Inject
    private MyUtility myUtil;

    public void initialize(ValidatableconstraintAnnotation) {
        //nothing
    }

    public boolean isValid(final MyBean myBean, 
                           final ConstraintValidatorContext constraintContext) {

        if (myBean == null) {
            return true;
        }
        //
        //----> Null pointer exception here.
        //
        return this.myUtil.isValid(myBean.getName());
    }
}

数据bean

@Validatable
public class MyBean {
    private String name;
    //Getter and Setter here
}

JSF支持bean

@Named
@SessionScoped
public class Page1 {
    //javax.validation.Validator
    @Inject
    private Validator validator;

    @Inject
    private MyBean myBean;

    //Submit method
    public void submit() {
        Set<ConstraintViolation<Object>> violations = 
                         this.validator.validate(this.myBean);
        if (violations.size() > 0) {
            //Handle error here.
        }
    }
}

运行后,我在java.lang.NullPointerException行的名为“Validator”的类中遇到return this.myUtil.isValid(myBean.getName());异常。我知道CDI不会注入我的实用程序实例。如果我错了,请纠正我。

我不确定我做错了什么,或者是bean验证限制。你能帮忙解释一下吗?

1 个答案:

答案 0 :(得分:5)

您的权利,Hibernate Constraint Validator默认情况下未注册为CDI-Bean(虽然无法接收依赖项)。

只需将Seam-Validation module放在类路径上,一切运行正常。

BTW:研究模块的source-code是CDI扩展的优雅和简洁的一个很好的例子。从CDI到休眠验证,它不需要超过几十行代码......

相关问题