Несколько регулярных выражений @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.
иначе, строит (с сопутствующими 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 {};
}