2012-04-11 6 views
2

Я пытался узнать JSF 2.0 с проверкой боба на уровне класса, как показано в следующем: -Проверка боб JSR 303, Удлиненная ConstraintValidator не может использовать CDI

Утилита

@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 в классе под названием "Validator" на линии return this.myUtil.isValid(myBean.getName());. Я понимаю, что CDI не вводит мой экземпляр утилиты. Пожалуйста, поправьте меня, если я ошибаюсь.

Я не уверен, что я делаю что-то неправильно или это ограничение проверки боба. Не могли бы вы помочь объяснить далее?

ответ

5

Ваше право, Hibernate Constraint Validator не зарегистрировано как CDI-Бин по умолчанию (и хотя не может получать зависимости).

Просто поместите Seam-Validation module на свой путь к классу, и все должно работать нормально.

BTW: изучение модуля source-code является отличным примером элегантности и простоты расширения CDI. Это не нужно больше нескольких десятков строк кода для перехода от CDI к спящим валидации ...

+0

Большое спасибо за ваш совет. –

+1

Я уверен, что Emmanuel и остальная часть EG добавят поддержку CDI для следующего раунда проверки Bean. – LightGuard

+0

Действительно, это [тема] (https://hibernate.onjira.com/browse/bval-238) для BV 1.1. Вы можете узнать больше в документе [ранний проект] (http://beanvalidation.org/1.1/spec/#d0e6698). Поделитесь с нами вашими мыслями. – Gunnar