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