2011-09-11 9 views
2

一部のBean検証に問題があります。JSFバリデーターの注文

基本的に私はインターネットユーザーが新しいプロファイルを作成できるフォームを持っており、ユーザー名を入力する必要があります。

は私がに関してユーザ名を検証する:

  1. パターン
  2. ユーザ名がすでに存在する場合、私は私自身のカスタム検証@UserExistsを書いた弾丸3について

。問題は、最初の2つのバリデータのいずれかが失敗した場合、このバリデータを実行したくないということです。

私のUserExistsバリデーターで@GroupSequenceを使用すると、シーケンスに関してトリックが実行されますが、他のバリデーターの1つが入力が無効であると報告された場合でもJSFは引き続きバリデーターを呼び出します。他のバリデータのいずれかがすでに失敗したかどうかどうか調べることはできますか?ここで

は、私がチェックしているしたかったプロパティです:

@Size(min = 3, max = 20) 
@Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*") 
@UserExists(message = "User already exists") 
private String username; 

カスタムバリデータは、次の属性があります。

@Target({ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = UserExistsValidator.class) 
@GroupSequence({Size.class, Pattern.class}) 
public @interface UserExists 

答えて

2

@GroupSequence注釈が制約をホスティングBeanで指定されることを意図しています。メンバーの検証グループは単一の制約ではなく指定する必要があります。

だからあなたの例では、そのように実装されることがあります。

@GroupSequence({Form.class, ExpensiveChecks.class}) 
public class Form { 

    public interface ExpensiveChecks {} 

    @Size(min = 3, max = 20) 
    @Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*") 
    @UserExists(message = "User already exists", groups=ExpensiveChecks.class) 
    private String username; 

} 

Formタイプのデフォルト・グループのシーケンスが再定義される方法。最初に、@Size@Patternの制約が検証されます。それが成功した場合にのみ@UserExists制約(ExpensiveChecksグループの一部です)が検証されます。

グループシーケンスとデフォルトグループシーケンスの再定義については、Hibernate Validator reference guideとBean Validation specificationで詳しく知ることができます。

+0

ありがとうございました。私はすでにリファレンスガイドにいましたが、明らかにそれを十分に読んでいませんでした。 – foens

関連する問題