0

これが可能かどうかはわかりません。同じクラス オブジェクトの他のフィールドの値を使用する 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)
4

1 に答える 1

0

ここでは、次の 2 つのことを行う必要があるようです。

1. 現在、カスタム検証がターゲット Bean のフィールドに適用されています。代わりにクラスに移動する必要があります。

@ValidateApplicationType
public final class AWRRecordObject

2. アノテーションをクラスに適用できるようにするには、アノテーション定義を変更する必要があります。

@Target({ TYPE, ANNOTATION_TYPE })
于 2012-05-07T19:04:33.313 に答える