Как использовать @Pattern в необязательных полях JSR 303
Как я могу использовать ограничение @Pattern
для необязательных полей формы?
@Pattern(regexp="...")
private String something;
как только я отправлю свою форму, я получаю ошибку проверки, как ожидалось, но пользователь может оставить поле пустым, так как это не обязательное поле.
PS: я мог бы написать свою аннотацию ограничения. Однако я просто попрошу более простой способ комбинировать аннотации или добавлять атрибуты аннотации. Реализация JSR303 является hibernate-validator.
Ответы
Ответ 1
Просто установите его вместо null
вместо пустой строки. Так как пустые поля ввода HTML по умолчанию представлены как пустая строка в качестве параметра HTTP-запроса, вы должны позволить вашей инфраструктуре MVC интерпретировать пустые представленные значения как null
. Это в JSF, легко выполняемом <context-param>
в web.xml
. Однако, поскольку вы используете Spring MVC, и я этого не делаю, я немного искал здесь и нашел этот ответ, который может быть полезен.
Ответ 2
Другой способ решить эту проблему - разрешить пустую строку как альтернативное действительное значение в вашем регулярном выражении (используя "|" ).
Как сказал BalusC в JSF 2, можно автоматически преобразовать пустые строки в нуль. Используемый параметр контекста: "javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", который должен быть установлен в "true" (см. Также этот ответ).
Ответ 3
Добавление пустого ограничения - лучший способ. В этом ограничении вы добавляете свой собственный @Pattern в качестве ограничения для компоновки.
@Target({ANNOTATION_TYPE, FIELD})
@Retention(RUNTIME)
@Documented
**@Pattern(regexp="...")**
@Constraint(validatedBy = EmptyValueConstraintValidator.class)
public @interface EmptyValueConstraint {
String message() default "{defaultMessage}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
EmptyValueConstraint[] value();
}
}
public class EmptyValueConstraintValidator implements
ConstraintValidator<EmptyValueConstraint, Object>{
@Override
public void initialize(EmptyValueConstraint constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return true;
}
}
Надеюсь, что это поможет.