2012-01-16 4 views
0

自分のクラスレベルのバリデーターで、値をチェックする前に他のバリデーターが有効であるかどうかを確認したいのですか?JSR303:そのフィールドが既に無効とマークされていることを確認するにはどうすればよいですか?

たとえば、その国がデータベースに存在するかどうかを確認する前に、有効な長さと一致パターンなどの他のテストに合格していることを確認する必要があります。

これを行う方法?


私が本当に欲しいものを明確にするために、これは実際の例です:

@ValidCredentials(groups = AuthAccountForm.FormChecks.class) 
public class AuthAccountForm { 

    @NotEmpty(groups = Login1Checks.class) 
    @Size.List({ 
     @Size(min = LOGIN_MIN_LENGTH, message = "{value.too-short}", groups = Login2Checks.class), 
     @Size(max = LOGIN_MAX_LENGTH, message = "{value.too-long}", groups = Login2Checks.class) 
    }) 
    @Pattern(regexp = LOGIN_REGEXP, message = "{login.invalid}", groups = Login3Checks.class) 
    private String login; 

    @NotEmpty(groups = Password1Checks.class) 
    @Size(min = PASSWORD_MIN_LENGTH, message = "{value.too-short}", groups = Password2Checks.class) 
    @Pattern(
     regexp = PASSWORD_REGEXP, 
     message = "{password.invalid}", 
     groups = Password3Checks.class 
    ) 
    private String password; 

    @GroupSequence({ Login1Checks.class, Login2Checks.class, Login3Checks.class }) 
    public interface LoginChecks { } 

    public interface Login1Checks { } 
    public interface Login2Checks { } 
    public interface Login3Checks { } 

    @GroupSequence({ Password1Checks.class, Password2Checks.class, Password3Checks.class }) 
    public interface PasswordChecks { } 

    public interface Password1Checks { } 
    public interface Password2Checks { } 
    public interface Password3Checks { } 

    public interface FormChecks { } 

} 

とコントローラで:だから

@RequestMapping(method = RequestMethod.POST) 
public String processInput(
     @Validated({ 
      LoginChecks.class, 
      PasswordChecks.class, 
      FormChecks.class 
     }) final AuthAccountForm form, 
     final BindingResult result) { 

、今小切手パスワードとログイン前ValidCredentialsValidatorで、私はそれらが有効であることを保証する必要があります。

答えて

0

グループとグループのシーケンスを使用する必要があります。グループシーケンスで、少なくとも1つの制約が失敗した場合、シーケンス内の次のグループの制約が検証されます。詳細はhereをご覧ください。例えば

@GroupSequence({ Person.class, Group1.class, Group2.class }) 
class Person { 
    @Size(min=4, groups=Group1.class) 
    @Pattern("[a-z]+", groups=Group1.class) 
    @CheckExistence(groups=Group2.class) 
    String country; 
} 

この例では、我々は既定のグループを検証する場合は、人に属する制約がまずグループ1とグループ2の制約の制約を検証します。 Group1の制約が満たされていない場合、Group2は検証されません。

+0

本当のコードを掲載していないことは大変残念です。 (更新された質問を参照してください)私はすでに '@GroupSequence'で' groups'を使っていますので、他のグループのシーケンスでそのチェックをテストする必要があります。 –

+0

こんにちは、問題ありません!あなたの@Validatedアノテーションでは、LoginChecks.class、PasswordChecks.class、FormChecks.classの間で順序を定義するグループシーケンスを渡さなければならないと思います。通常、グループシーケンスValidCredentialsValidatorに対して定義されたBVアルゴリズムは、パスワードとログインが有効な場合にのみ呼び出されます。 – kevinpollet

関連する問題