Проверка бина JSR 303, расширенный ConstraintValidator не может использовать CDI
Я попытался изучить 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());
}
}
Бин данных
@Validatable
public class MyBean {
private String name;
//Getter and Setter here
}
Фасоль JSF
@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
в классе с именем "Валидатор" в строке return this.myUtil.isValid(myBean.getName());
, Я понимаю, что CDI не внедряет мой экземпляр утилиты. Пожалуйста, поправьте меня, если я ошибаюсь.
Я не уверен, что делаю что-то не так или это ограничение проверки бина. Не могли бы вы помочь объяснить дальше?
1 ответ
Ваше право, Hibernate Constraint Validator по умолчанию не зарегистрирован как CDI-компонент (и хотя не может получать зависимости).
Просто поместите модуль проверки шва на ваш путь к классу, и все должно работать нормально.
Кстати: изучение исходного кода модуля является отличным примером элегантности и простоты расширения CDI. Для перехода от CDI к проверке гибернации не требуется более нескольких десятков строк кода...