3

Web アプリケーションを Spring 3.0.5 から 3.1.1 にアップグレードしてから、フォーム Bean を検証するときに深刻なエラーに直面する必要があります。以前に構成したバリデーターが正常に機能しなくなりました。問題は、クラスorg.springframework.validation.ErrorsのメソッドgetFieldValue(String fieldname)が元のバインドされた Bean 値を返さないことです (以前はそうでした)。

これが私のフォーム Bean の外観です。

public class PersonBean extends BaseFormBean {

private String firstname; // getters and setter omitted...

    private String lastname; // getters and setter omitted...

    private Integer age; // getters and setter omitted...

    public PersonBean() {}

    @Override
    public void validateForm(Errors errors) {
        WebValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstname", "validator.requiredvalidator.lbl", "field required");
        WebValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastname", "validator.requiredvalidator.lbl", "field required");      
        WebValidationUtils.rejectInvalidIntValue(errors, "age", "validator.std.age", "invalid age", false);
    }
}

呼び出される WebValidationUtils クラスには、Bean プロパティをチェックするための標準メソッドがいくつかあります。このエラーは、Integer 型のプロパティ age など、文字列以外の値でのみ発生します。コレクションでも発生します。

次のスニペットは、utils-class で整数値がどのように検証されるかを示しています。

import org.springframework.validation.Errors;
...

public abstract class WebValidationUtils {
...
    public static void rejectInvalidIntValue(Errors errors, String field, String errorCode, String defaultMessage){
        Assert.notNull(errors, "Errors object must not be null");
        Object value = errors.getFieldValue(field); // returns the string value (type: java.lang.String)
                Class<?> fieldType = errors.getFieldType(field); // returns the class Integer!
        if (value == null || !value.getClass().equals(Integer.class) || ((Integer)value).intValue() <= 0){
                errors.rejectValue(field, errorCode, null, defaultMessage);
        }
    }
}

Bean 自体には正しい値がバインドされています...

context-servlet.xml でいくつかの追加の Spring Bean を構成する必要がありますか?

編集:メソッド「getFieldValue(...)」の公式Spring Dokuは言う

現在の Bean プロパティ値または最後のバインディングから拒否された更新のいずれかである、指定されたフィールドの現在の値を返します。

したがって、このメソッドが整数型の伝播された Bean 値ではなく文字列値を返す理由がわかりません...

4

1 に答える 1

1

バインディング エラーがあるように見えるので、バインディング エラーの原因となった値をgetFieldValue()返しFieldError.getFieldValue()ます。これは予期される動作です。

getRawFieldValue()代わりに使用して、プロパティを保持する値を取得できます。このメソッドは常に を使用して値を返しますPropertyAccessor

于 2012-05-15T19:04:46.973 に答える