2012-05-07 12 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(); 
} 

コードは、Beanへの固定長ファイル格納解析された値を読み取ります。私は以下のコードでこれを実装してみました

1:あなたがここに行うために必要な2つのものがあるよう

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

これを試してみます。その間、3つのフィールドを引数として持つクラスのコンストラクタに対してカスタム検証を実行しようとしました。 –

関連する問題