한 번에 두 개 이상의 입력란의 유효성을 검사하려면 유형 수준에서 특수 효과를 사용하고 REGEXP를 사용하여 모든 문자열 입력란을 검사하는 맞춤 검사기를 작성하십시오.
편집 : 예제를 제공하십시오. 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에 의해 검증되지 않습니다. 그러나 사용자 정의 검사기가 모든 문자열 필드를 검사하는 방법은 무엇입니까? 위의 예제에서 – andyfinch
은 "l"이 "hello"및 "world"와 모두 일치하기 때문에 오류가 발생하지 않습니다. "ll"로 변경하여 ConstraintViolation을 얻으십시오. –
감사합니다. Jan, 아주 좋은 예와 나는 그것으로부터 새로운 것들을 배웠습니다. – andyfinch