Как использовать @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;
    }



}

Надеюсь, что это поможет.