Как я могу использовать проверку уровня параметра метода с JSF 2.2?

Я создал валидатор бина, который применяю к своему методу установки бина. Вместо того, чтобы получить ошибку проверки JSF, я получаю исключение. Есть ли способ заставить это работать, или мне следует использовать традиционный валидатор JSF?

//Bean Method
public void setGuestPrimaryEmail(@ValidEmail String email){
   guest.getEmails().get(0).setValue(email);
}

//Validator interface
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
public @interface ValidEmail {

    String message() default "{invalid}";

    Class<? extends Payload>[] payload() default {};

    Class<?>[] groups() default {};

}

//Validator impl
public class EmailValidator implements ConstraintValidator<ValidEmail, String> {

    private Pattern p;

    @Override
    public void initialize(ValidEmail constraintAnnotation) {
        p = java.util.regex.Pattern
                .compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (DothatUtils.isEmpty(value)) {
            return true;
        }

        boolean invalid = !p.matcher(value).matches();
        if (invalid)
            return false;

        return true;
    }

}

Исключение:

2013-11-30T20:58:41.747+0000|SEVERE: javax.faces.component.UpdateModelException: 
javax.el.ELException: /index.xhtml @144,86 value="....": 
javax.validation.ConstraintViolationException: 1 constraint violation(s) occurred during method validation.

Примечание. Я использую GF4 с JSF 2.2.4. Если я помещу свою пользовательскую аннотацию в поле, она будет работать, как и ожидалось.


person Ioannis Deligiannis    schedule 30.11.2013    source источник
comment
Может ли это помочь вам?   -  person Tiny    schedule 01.12.2013
comment
Спасибо за ваш ответ, но проверка работает правильно, если я аннотирую свои объекты. Обновлю свой вопрос.   -  person Ioannis Deligiannis    schedule 01.12.2013
comment
Как выглядит ваш валидатор ограничений (EmailValidator)?   -  person Tiny    schedule 01.12.2013
comment
Я обновлю вопрос кодом, но он отлично работает, если применяется к полю, а не к параметру метода.   -  person Ioannis Deligiannis    schedule 01.12.2013
comment
Не могли бы вы попробовать добавить ElementType.METHOD к аннотации @Target в дескрипторе ограничения?   -  person Tiny    schedule 01.12.2013
comment
Ваше предложение само по себе не сработало. Я неправильно помещал валидатор на setter, а не на getter. Когда я переместил аннотацию в геттер, все заработало нормально. Вы хотите опубликовать это как ответ?   -  person Ioannis Deligiannis    schedule 01.12.2013
comment
На вопросы могут ответить опытные люди, а я нет :) (я первый раз отвечаю на вопрос). Вместо этого вы можете опубликовать свое собственное решение в качестве ответа. Спасибо.   -  person Tiny    schedule 01.12.2013


Ответы (1)


ElementType.PARAMETER не распознается поставщиком проверки bean-компонентов JSR303 по умолчанию.

Из спецификации JSR303 1.0:

2.1 Аннотация ограничения

...

Аннотации ограничений могут быть нацелены на любой из следующих ElementTypes:

  • FIELD для ограниченных атрибутов
  • METHOD для ограниченных геттеров
  • TYPE для ограниченных бобов
  • ANNOTATION_TYPE для ограничений, составляющих другие ограничения

Хотя другие ElementType не запрещены, поставщику не нужно распознавать и обрабатывать ограничения, наложенные на такие типы. Встроенные типы поддерживают PARAMETER и CONSTRUCTOR, чтобы разрешить определенные расширения поставщика Bean Validation. Использование того же подхода для пользовательских аннотаций считается хорошей практикой.

Вам действительно нужно поместить аннотацию ограничения на свойство (обозначается ElementType.FIELD) или на геттер (обозначается ElementType.METHOD). Обратите внимание, что ограниченный сеттер не поддерживается!

person BalusC    schedule 01.12.2013
comment
Привет, BalusC, можем ли мы использовать параметризованную проверку? не могли бы вы привести пример? Это очень поможет. Заранее спасибо. - person Mukundhan; 05.05.2020