Проверка бина 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 к проверке гибернации не требуется более нескольких десятков строк кода...

Другие вопросы по тегам