2012-04-11 10 views
2

を使用することはできません私は次のようにクラスレベルで豆の検証と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()); 
    } 
} 

データ豆

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

JSFのバッキングBean私はラインreturn this.myUtil.isValid(myBean.getName());で "バリ" という名前のクラスでjava.lang.NullPointerExceptionとして例外に直面してきました実行した後

@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. 
     } 
    } 
} 

。私は、CDIが私のユーティリティインスタンスを挿入しないことを理解しています。私が間違っている場合は私を修正してください。

私が何か間違っているのか、それとも豆の検証の制限なのか分かりません。さらに説明するのを助けてくれますか?

答えて

5

あなたの右のHibernate Constraint Validatorは、デフォルトでCDI-Beanとして登録されていません(ただし、依存関係を受け取ることはできません)。

クラスパスにSeam-Validation moduleを置くだけで、すべて正常に動作するはずです。

BTW:モジュールのsource-codeを調べることは、CDI拡張の優雅さとシンプルさの優れた例です。 CDIから妥当性確認を橋渡しするには、数十行以上のコードを必要としません。

+0

ありがとうございました。 –

+1

私はEmmanuelとEGの残りの人たちが次のBean検証のためのCDIサポートを追加していると確信しています。 – LightGuard

+0

これはBV 1.1の[トピック](https://hibernate.onjira.com/browse/bval-238)です。 [初期ドラフト](http://beanvalidation.org/1.1/spec/#d0e6698)のドキュメントで詳しく知ることができます。あなたの考えを教えてください。 – Gunnar

関連する問題