0

私はクラスを持っています:

public class Foo {
    @Length(min = 6, max = 30)
    @Pattern(regexp = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "{error.password.too_simple}")
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

ご覧のとおり、1 つのフィールド「password」と 2 つの検証アノテーションがあります。しかし、場合によっては、両方ではなく、一方だけを適用する必要があります。例: 空の文字列 "" がある場合、最初の ( @Length ) という 1 つの制限のみが適用されますが、私の状況では両方の制限が適用されます。どうすればよいですか、状況で 1 つの制限のみを適用するにはどうすればよいですか?

4

1 に答える 1

3

制約をさまざまな検証グループに割り当て、グループシーケンスを使用して検証することができます。たとえば、次のデフォルトのグループシーケンスを再定義しFooます。

public interface EmptyChecks {}

@GroupSequence( { EmptyChecks.class, Foo.class } )
public class Foo {
    @Length(min = 6, max = 30, groups=EmptyChecks.class)
    @Pattern(regexp = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "{error.password.too_simple}")
    private String password;

    //...
}

これで、制約が有効な@Pattern場合にのみ制約が検証さ@Lengthれます。

特定のケースは、制約^$の正規表現で空の値()を受け入れることによっても解決される可能性があります。@Password

@Pattern(regexp = "(^$|(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*)", message = "")

このようにして、両方の制約が検証さ@Lengthれますが、空の入力値に対しては制約のみが失敗します。

于 2013-01-14T08:44:09.183 に答える