Die JSR 303-Bean-Validierung. Der erweiterte ConstraintValidator kann die CDI nicht verwenden
Ich habe versucht, JSF 2.0 mit Bean-Validierung auf Klassenebene wie folgt zu lernen:
Das Dienstprogramm
<code>@Singleton public class MyUtility { public boolean isValid(final String input) { return (input != null) || (!input.trim().equals("")); } } </code>
Die Einschränkungsannotation
<code>@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 {}; } </code>
Der Constraint Validator
<code>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()); } } </code>
Die Datenbohne
<code>@Validatable public class MyBean { private String name; //Getter and Setter here } </code>
Die JSF Backing Bean
<code>@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. } } } </code>
Nach dem Laufen habe ich die Ausnahme als konfrontiertjava.lang.NullPointerException
in der Klasse mit dem Namen "Validator" in der Zeilereturn this.myUtil.isValid(myBean.getName());
. Ich verstehe, dass das CDI meine Dienstprogramminstanz nicht injiziert. Bitte korrigieren Sie mich, wenn ich falsch liege.
Ich bin mir nicht sicher, ob ich etwas falsch mache oder ob es sich um eine Bean-Validierungsbeschränkung handelt. Könnten Sie bitte helfen, weiter zu erklären?