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 値ではなく文字列値を返す理由がわかりません...