2012-05-07 6 views
0

이것이 가능한지 확실하지 않습니다. 동일한 클래스 객체의 다른 필드 값을 사용하는 bean 필드에 대한 사용자 정의 제약 조건을 생성 할 수 있는지 궁금합니다.다른 필드 값을 사용하는 bean 필드의 사용자 정의 유효성 검사기

public static AWRRecordObject bufferedReader() throws IOException { 

    int lineCount = 0; 
    long time1 = System.currentTimeMillis(); 
    File file = new File("D://TestData/test.txt"); 
    BufferedReader br = new BufferedReader(new FileReader(file), 8192); 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    validator = factory.getValidator(); 
    String line; 

    while ((line = br.readLine()) != null) { 

     String type = line.length() > 2 ? line.substring(0, 2) : line; 

     AWRRecordObject record = new AWRRecordObject(line, type, lineCount); 

     Set<ConstraintViolation<AWRRecordObject>> constraintViolations = validator 
       .validate(record); 

     if (constraintViolations.size() > 0) { 

      Iterator it = constraintViolations.iterator(); 
      while (it.hasNext()) { 
       ConstraintViolation<AWRRecordObject> cv = (ConstraintViolation<AWRRecordObject>) it 
         .next(); 
       System.out.println(cv.getInvalidValue()); 
       System.out.println(cv.getMessage()); 

      } 

     } 

     return record; 
    } 
} 

불행하게도, 나는 다음과 같은 오류 메시지가 점점 오전 :

public final class AWRRecordObject extends DoaAbstract implements 
     java.io.Serializable { 
    private static final long serialVersionUID = 1L; 

    @ValidateApplicationType 
    private String applicationType; 

    private String recordData; 

    private String programSource; 

    // ... 
} 

public class ApplicationTypeValidator implements 
     ConstraintValidator<ValidateApplicationType, AWRRecordObject> { 

    private Class<AWRRecordObject> awrRecObj; // ? 

    @Override 
    public void initialize(ValidateApplicationType constraintAnnotation) { 
     this.awrRecObj = constraintAnnotation.value(); 
    } 

    @Override 
    public boolean isValid(String arg0, ConstraintValidatorContext arg1) { 

     // verify if the application type is A1 and length is 512 
     if ((awrRecObj.getApplicationType() 
       .equalsIgnoreCase(AWRConstant.AWR_W2)) 
       && (awrRecObj.getRecordData().toString().length() != AWRConstant.W2_RECORD_LEN) 
       && (awrRecObj.getProgramSource() 
         .equalsIgnoreCase(AWRConstant.SOURCE_BATCH))) { 

      // create AWRRequestError Object and add it to AWRRecordObject 
      AWRUtility.createAWRRequestErrorObject(awrRecObj, 
        AWRErrorTypeCode.W2_RECORD_LENGTH_ERROR, 
        awrRecObj.getRecordData()); 
      return false; 
      // ... 
     } 

     return true; 
    } 
} 

@Target({ METHOD, FIELD, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = { ApplicationTypeValidator.class }) 
public @interface ValidateApplicationType { 

    String message() default "{com.myproject.validation.ApplicationType.message}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    Class<AWRRecordObject> value(); 
} 

코드는 빈에 고정 길이 파일 저장 분석 값을 읽 나는 아래의 코드로 이것을 구현하는 시도

1 : 당신이해야 할 두 가지가있는 것처럼

Exception in thread "main" javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.String 
at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:383) 

답변

0

보인다. 현재 사용자 정의 유효성 검증이 대상 bean의 필드에 적용됩니다. 대신 클래스로 이동해야합니다.

@ValidateApplicationType 
public final class AWRRecordObject 

2. 어노테이션을 클래스에 적용하려면 주석 정의를 변경해야합니다.

@Target({ TYPE, ANNOTATION_TYPE }) 
+0

나는 이것을 시험해 보겠다. 그 동안 세 개의 필드를 인수로 가진 클래스의 생성자에 대해 사용자 지정 유효성 검사를 수행하려고했습니다. –

관련 문제