Я сделал это, создав собственную аннотацию валидации.
@Documented
@Retention(RUNTIME)
@Target({METHOD,FIELD})
@Constraint(validatedBy=PropertyPatternValidator.class)
public @interface PropertyPattern {
String property();
String message() default "{validator.propertypattern}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
И реализация Validator
public class PropertyPatternValidator implements ConstraintValidator<PropertyPattern, CharSequence> {
private Map<String, Pattern> patterns = new HashMap<>();
private Pattern pattern;
@Override
public void initialize(PropertyPattern propPattern) {
String property = propPattern.property();
pattern = patterns.computeIfAbsent(property, prop -> {
Properties applicationProps = (Properties) ApplicationContextProvider.getApplicationContext()
.getBean("applicationProps");
String p = applicationProps.getProperty(prop);
return Pattern.compile(p);
});
}
@Override
public boolean isValid(CharSequence inputToValidate, ConstraintValidatorContext ctx) {
CharSequence input = inputToValidate != null ? inputToValidate : "";
Matcher m = pattern.matcher(input);
return m.matches();
}
}
Использование:
@PropertyPattern(property ="pattern.account")
private String accountNumber;
Тогда, пока pattern.account
находится в файле свойств и установлен в допустимое регулярное выражение, это будет работать.