Как использовать @Pattern на необязательных полях JSR 303 - PullRequest
12 голосов
/ 14 мая 2011

Как я могу использовать @Pattern ограничение для необязательных полей формы?

@Pattern(regexp="...")
private String something;

как только я отправляю свою форму, я получаю ошибку проверки, как и ожидалось, но пользователь может оставить поле пустым, так как это поле не является обязательным.

PS: я мог бы написать свою собственную аннотацию ограничения. Однако я просто прошу более простой способ объединения аннотаций или добавления атрибутов аннотаций. Реализация JSR303 - это hibernate-validator.

Ответы [ 3 ]

7 голосов
/ 14 мая 2011

Просто установите его с null вместо пустой строки.Поскольку пустые поля ввода HTML по умолчанию отправляются как пустая строка в качестве параметра HTTP-запроса, вам нужно позволить вашей MVC-структуре интерпретировать пустые отправленные значения как null.Это в JSF легко сделать с помощью <context-param> в web.xml.Однако, поскольку вы используете Spring MVC, а я этого не делаю, я немного поискал здесь и нашел этот ответ , который может быть полезен.

3 голосов
/ 27 мая 2011

Другой способ решения этой проблемы - разрешить использование пустой строки в качестве альтернативного допустимого значения в вашем регулярном выражении (используя «|»).

Как сказал BalusC в JSF 2, можно автоматически преобразовывать пустые строки в ноль.Используемый параметр контекста: «javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL», который должен быть установлен в «true» (см. Также answer ).

0 голосов
/ 26 мая 2012

Добавление пустого ограничения - лучший способ.В этом ограничении вы добавляете свой собственный @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;
    }



}

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

...