我尝试在类级别学习带有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验证限制。你能帮忙解释一下吗?
答案 0 :(得分:5)
您的权利,Hibernate Constraint Validator默认情况下未注册为CDI-Bean(虽然无法接收依赖项)。
只需将Seam-Validation module放在类路径上,一切运行正常。
BTW:研究模块的source-code是CDI扩展的优雅和简洁的一个很好的例子。从CDI到休眠验证,它不需要超过几十行代码......