Несколько регулярных выражений @Pattern для 1 поля?

Я попытался применить несколько аннотаций @Pattern к одному полю:

@Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit.")
@Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter.")
@Pattern(regexp = "(?=.*[A-Z])", message = "Password must contain one uppercase letter.")
@Pattern(regexp = "(?=S+$)", message = "Password must contain no whitespace.")
private String password;

однако, я не могу этого сделать. Я хочу, чтобы отдельные сообщения на нарушенное ограничение regex в поле пароля. Возможно ли это?

Моя альтернатива-использовать теги JSF 2.0 f:validatorRegex.

4 ответов


вы можете использовать внутренний @List аннотации @Pattern:

@Pattern.List({
    @Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit."),
    @Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter."),
    @Pattern(regexp = "(?=.*[A-Z])", message = "Password must contain one uppercase letter."),
    @Pattern(regexp = "(?=\S+$)", message = "Password must contain no whitespace.")
})
private String password;

решение Гуннара не сработает для меня... '.+ в его выражения отсутствуют. Тем не менее, я использую patternList Михала, и он работает как шарм для меня. (Игра 2.3.x / Ebean-ORM)

@Pattern.List({
        @Pattern(regexp = "(?=.*[0-9]).+", message = "Password must contain one digit."),
        @Pattern(regexp = "(?=.*[a-z]).+", message = "Password must contain one lowercase letter."),
        @Pattern(regexp = "(?=.*[A-Z]).+", message = "Password must contain one upper letter."),
        @Pattern(regexp = "(?=.*[!@#$%^&*+=?-_()/\"\.,<>~`;:]).+", message ="Password must contain one special character."),
        @Pattern(regexp = "(?=\S+$).+", message = "Password must contain no whitespace.")
})
@Constraints.Required()
public String password1;

возможно, вы захотите изучить состав ограничений. Вы создадите одну аннотацию для ограничения пароля, составленную из аннотации @Pattern,а затем, наконец, построите одну составленную аннотацию, используя ранее определенные четыре. Это не потребует дополнительного кода java.

http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#validator-customconstraints-compound

иначе, строит (с сопутствующими Java-код) настраиваемого аннотация называется @PasswordValidator.

Мне, как правило, нравятся составленные валидаторы, поскольку это делает цель аннотаций проверки ясной для их цели, вместо того, чтобы иметь много непересекающихся аннотаций.


Я изменил ответ Гуннара и написал составное ограничение, и теперь это, похоже, работает правильно на 4 модульных тестах:

@NotNull
@Size(min=6, max=45)
@Pattern.List({
    @Pattern(regexp = "(?=.*[0-9]).+", message = "Password must contain one digit."),
    @Pattern(regexp = "(?=.*[a-z]).+", message = "Password must contain one lowercase letter."),
    @Pattern(regexp = "(?=.*[A-Z]).+", message = "Password must contain one uppercase letter."),
    @Pattern(regexp = "(?=.*[!@#$%^&*+=?-_()/\"\.,<>~`;:]).+", message ="Password must contain one special character."),
    @Pattern(regexp = "(?=\S+$).+", message = "Password must contain no whitespace.")
})
@Constraint(validatedBy = {}) // constraints composition
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface StrongPassword {

     String message() default "Password doesn't match bean validation constraints.";
     Class<?>[] groups() default {};
     Class<? extends Payload>[] payload() default {};
}