Проверка компонентов JSR-303 аннотирует несколько полей - PullRequest
0 голосов
/ 21 марта 2012

Я только начал тестировать валидацию JSR-303 Bean и задавался вопросом, возможно ли что-нибудь. В нашем приложении есть регулярное выражение по умолчанию для всех полей String. Если я хочу применить это с помощью проверки компонентов, я думаю, что мне нужно аннотировать каждое поле в моем объекте формы.

@Pattern(regexp = REG_EXP)
private String aString;

@Pattern(regexp = REG_EXP)
private String anotherString;

Можно ли применить @Pattern ко всем строкам (или определенным полям) одним ударом? Мы используем реализацию Hibernate на Weblogic 10.3.4 с JSF2.0 в качестве внешнего интерфейса. Проверка должна быть независимой от просмотра, поскольку я могу прийти с веб-службы.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Чтобы проверить более одного поля одновременно, используйте аннотацию на уровне типа и напишите пользовательский валидатор, который проверяет все поля String, используя ваш REGEXP.

Редактировать: Предоставить пример.Это довольно уродливо, потому что он использует Reflection и нарушает безопасность, но, возможно, он дает вам общее представление.Если вы используете не «объект», а конкретный класс или интерфейс, вы можете добиться успеха с обычными получателями.

Тестируемый класс (и Бегун)

   import javax.validation.Validation;
import javax.validation.Validator;

import validation.AllStringsRegex;

@AllStringsRegex(value="l")
public class UnderValidation {
    String a;
    String b;

   public static void main(String... args) {
       UnderValidation object = new UnderValidation();
       object.a = "hello";
       object.b = "world";

       Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
       System.out.println(validator.validate(object));
   }
}

Моя аннотация:

@Target( { TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = AllStringsRegexValidator.class)
@Documented
public @interface AllStringsRegex {
    String message() default "String not regex";
    String value() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Мой валидатор

public class AllStringsRegexValidator implements ConstraintValidator<AllStringsRegex, Object> {
    private Pattern pattern = null;

    @Override
    public void initialize(AllStringsRegex annotation) {
        pattern = Pattern.compile(annotation.value());
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext ctx) {
        for (Field f : object.getClass().getDeclaredFields()) {
            if (f.getType().equals(String.class)) {
                try {
                    f.setAccessible(true);
                    String value = (String)f.get(object);
                    if (!pattern.matcher(value).find()) {
                        return false;
                    }
                }
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
}
0 голосов
/ 21 марта 2012

Я не использовал, но java поддерживает скрипты на стороне сервера, используя grovvy, javascript ... Вы можете проверить @ScriptAssert(lang = "javascript", script =_this.startDate.before(_this.endDate) аннотацию скриптинга, которая является аннотацией спящего режима.

...