複数のフィールドを一度に検証するには、タイプレベルでアノテーションを使用し、REGEXPを使用してすべてのStringフィールドをチェックするカスタムValidatorを作成します。
編集:例を示します。これはReflectionを使用し、セキュリティに違反するため、これはかなり醜いですが、一般的な考えを与えるかもしれません。あなたが "オブジェクト"を使わずに具体的なクラスやインタフェースを使っていないなら、通常のgetterで成功する可能性があります。
テスト下のクラス(およびランナー)
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;
}
}
ありがとうございますが、@typeはJSFによって検証されません。しかし、カスタムバリデーターはどのようにすべてのStringフィールドをチェックしますか?上記の例の – andyfinch
では、 "l"は "hello"と "world"の両方に一致するため、エラーはスローされません。 ConstraintViolationを取得するには "ll"に変更してください。 –
ありがとう、非常に良い例と私はそれからいくつかの新しいものを学びました。 – andyfinch