2012-03-21 2 views
0

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

@Pattern(regexp = REG_EXP) 
private String aString; 

@Pattern(regexp = REG_EXP) 
private String anotherString; 

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

ответ

2

Чтобы проверить несколько полей одновременно, используйте аннотацию на уровне уровня и напишите специальный валидатор, который проверяет все поля 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 {}; 
} 

Моего Validator

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

Спасибо, но @type не подтвержден JSF. Но как бы пользовательский валидатор проверял все поля String? – andyfinch

+0

в примере выше, ошибка не возникает, потому что «l» соответствует как «привет», так и «мир». измените на «ll», чтобы получить ConstraintViolation. –

+0

Спасибо, Ян, очень хороший пример, и я узнал от него что-то новое. – andyfinch

0

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

+0

Спасибо, но я только что отредактировал мой вопрос как потребность валидации для запуска независимо от метода доступа, то есть через Webservice или Browser. – andyfinch

 Смежные вопросы

  • Нет связанных вопросов^_^