不确定这是否可能。想知道我是否可以为 bean 的字段创建一个自定义约束,它将使用同一类对象的其他字段的值。我尝试使用下面的代码来实现它:
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 中:
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;
}
}
不幸的是,我收到以下错误消息:
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)