2012-04-11 9 views
2

Ich habe versucht, die JSF 2.0 mit Bohnen Validierung auf Klassenebene wie die folgenden lernen: -Die JSR 303 Bean Validierung Die erweiterte ConstraintValidator kann nicht die CDI verwendet

Das Dienstprogramm

@Singleton 
public class MyUtility { 
    public boolean isValid(final String input) { 
     return (input != null) || (!input.trim().equals("")); 
    } 
} 

die Constraint Annotation

@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 {}; 
} 

die Constraint validator

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()); 
    } 
} 

Die Daten bean

@Validatable 
public class MyBean { 
    private String name; 
    //Getter and Setter here 
} 

Die JSF Backing 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. 
     } 
    } 
} 

Nach dem Ausführen ich die Ausnahme als java.lang.NullPointerException in der Klasse konfrontiert habe den Namen "Validator" an der Linie return this.myUtil.isValid(myBean.getName());. Ich verstehe, dass der CDI meine Dienstprogramminstanz nicht injiziert. Bitte korrigieren Sie mich, falls ich falsch liege.

Ich bin mir nicht sicher, ob ich etwas falsch mache oder es eine Bean-Validierung Einschränkung ist. Könnten Sie bitte weiter erklären?

Antwort

5

Ihr Recht, Hibernate Constraint Validator ist standardmäßig nicht als CDI-Bean registriert (und kann keine Abhängigkeiten empfangen).

Setzen Sie einfach die Seam-Validation module auf Ihren Klassenpfad, und alles sollte gut laufen.

BTW: Studium der source-code des Moduls ist ein hervorragendes Beispiel für die Eleganz und Einfachheit der CDI-Erweiterung. Es braucht nicht mehr als ein paar Dutzend Zeilen Code, um von CDI zu Hibernate Validierungen zu überbrücken ...

+0

Vielen Dank für Ihren Rat. –

+1

Ich bin mir ziemlich sicher, dass Emmanuel und der Rest der EG die CDI-Unterstützung für die nächste Runde der Bean Validation hinzufügen. – LightGuard

+0

Tatsächlich ist das ein [Thema] (https://hibernate.onjira.com/browse/bval-238) für BV 1.1. Sie können mehr im Dokument [früher Entwurf] (http://beanvalidation.org/1.1/spec/#d0e6698) erfahren. Lass uns wissen was du denkst. – Gunnar

Verwandte Themen