Чтобы проверить несколько полей одновременно, используйте аннотацию на уровне уровня и напишите специальный валидатор, который проверяет все поля 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;
}
}
Спасибо, но @type не подтвержден JSF. Но как бы пользовательский валидатор проверял все поля String? – andyfinch
в примере выше, ошибка не возникает, потому что «l» соответствует как «привет», так и «мир». измените на «ll», чтобы получить ConstraintViolation. –
Спасибо, Ян, очень хороший пример, и я узнал от него что-то новое. – andyfinch