2012-03-21 3 views
0

JSR-303 Bean 유효성 검사를 시작했으며 뭔가 가능했는지 궁금합니다. 우리는 모든 문자열 필드에 대한 응용 프로그램의 기본 정규 표현식을 가지고 있습니다. 빈 유효성 검사를 사용하여 이것을 적용하려면 양식 객체 내의 각 필드에 주석을 달아야한다고 생각합니다.JSR-303 Bean 유효성 검사는 여러 필드에 주석을 달아줍니다.

@Pattern(regexp = REG_EXP) 
private String aString; 

@Pattern(regexp = REG_EXP) 
private String anotherString; 

한 번의 히트로 모든 문자열 (또는 특정 필드)에 @ 패턴을 적용 할 수 있습니까? 우리는 JSF2.0을 프론트 엔드로 사용하여 Weblogic 10.3.4에서 Hibernate 구현을 사용하고 있습니다. 유효성 검사는 웹 서비스에서 들어올 수 있으므로 뷰와 독립적이어야합니다.

답변

2

한 번에 두 개 이상의 입력란의 유효성을 검사하려면 유형 수준에서 특수 효과를 사용하고 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; 
    } 
} 
+0

감사하지만 @type은 JSF에 의해 검증되지 않습니다. 그러나 사용자 정의 검사기가 모든 문자열 필드를 검사하는 방법은 무엇입니까? 위의 예제에서 – andyfinch

+0

은 "l"이 "hello"및 "world"와 모두 일치하기 때문에 오류가 발생하지 않습니다. "ll"로 변경하여 ConstraintViolation을 얻으십시오. –

+0

감사합니다. Jan, 아주 좋은 예와 나는 그것으로부터 새로운 것들을 배웠습니다. – andyfinch

0

나는 grovvy, javascript를 사용하여 서버 측에서 스크립팅을 지원하지 않았다. 최대 절전 모드 주석 인 @ScriptAssert(lang = "javascript", script =_this.startDate.before(_this.endDate) 스크립트 주석을 확인할 수있다.

+0

감사하지만 난 그냥 검증 요구로 내 질문에 편집 한 액세스 방법에 상관없이 웹 서비스 또는 브라우저를 통해 실행됩니다. – andyfinch

관련 문제