2012-04-11 32 views
2

我試圖在類的級別與Bean驗證學習JSF 2.0,如下所示: -的JSR 303 Bean驗證,擴展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()); 
    } 
} 

的數據bean

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

的JSF支持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. 
     } 
    } 
} 

運行,我所面臨的異常,因爲java.lang.NullPointerException在該行return this.myUtil.isValid(myBean.getName());命名爲 「驗證」 下課後。我知道CDI不會注入我的實用程序實例。如果我錯了,請糾正我。

我不確定我是否做錯了什麼,或者它是一個bean驗證限制。你能幫忙解釋一下嗎?

回答

5

您的權利,默認情況下Hibernate Constraint Validator未註冊爲CDI-Bean(雖然無法接收依賴關係)。

只要把Seam-Validation module放在你的類路徑上,一切都應該正常運行。

順便說一下:學習模塊的source-code是CDI擴展的優雅和簡單的一個很好的例子。它不需要超過幾十行代碼就可以從CDI連接到休眠驗證......

+0

非常感謝您的建議。 – 2012-04-11 08:50:03

+1

我很確定Emmanuel和EG的其他成員正在爲下一輪Bean驗證添加CDI支持。 – LightGuard 2012-04-11 16:45:12

+0

事實上,這是BV 1.1的[主題](https://hibernate.onjira.com/browse/bval-238)。您可以在[早期草稿](http://beanvalidation.org/1.1/spec/#d0e6698)文檔中瞭解更多信息。讓我們知道您的想法。 – Gunnar 2012-04-12 20:51:01