由於將我的web應用從Spring 3.0.5升級到3.1.1,因此在驗證我的表單bean時不得不面對一些嚴重的錯誤。我以前配置的驗證程序不再像他們應該那樣工作。問題是,該方法getFieldValue(字符串字段名)從類org.springframework.validation.Errors沒有返回原來的綁定豆價值像它應該(而且是之前)。Spring 3.1.1.RELEASE數據綁定:驗證提交表單時出錯
這是我的形式豆的樣子:
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);
}
}
是被調用對檢查bean屬性一些標準方法的WebValidationUtils級。錯誤僅在非字符串值上發生,例如類型爲Integer的屬性年齡。它也發生在Collection(s)上。
以下片段展示了整數值是如何在我的utils的一流驗證:
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本身具有綁定的正確值...
我必須配置一些產生額外的Spring bean在我的context-servlet.xml中是否可以達到與3.0.5中相同的效果?
編輯:官方Spring Doku的方法「getFieldValue(...)說:」
返回給定字段的當前值,無論是當前bean屬性值或從最後一個綁定更新拒絕。
所以我沒有線索,爲什麼這個方法返回一個字符串值,而不是整數型的傳播豆值...
好的,那個伎倆。我不得不在我的驗證類中使用另一個名爲org.springframework.validation.BindingResult的接口。 使用此接口,可以訪問方法getRawFieldValue(String field),並且可以讀取bean屬性的原始值。但我不明白爲什麼春季框架的更新會導致這種好奇的行爲? thx很多jose! –