2012-05-14 41 views
3

由於將我的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屬性值或從最後一個綁定更新拒絕。

所以我沒有線索,爲什麼這個方法返回一個字符串值,而不是整數型的傳播豆值...

回答

1

看起來像你有約束力的錯誤,以便getFieldValue()回報FieldError.getFieldValue()那返回導致綁定錯誤的值。這是預期的行爲。

您可以改爲使用getRawFieldValue()來獲得保留該房產的價值。此方法始終使用PropertyAccessor返回值。

+0

好的,那個伎倆。我不得不在我的驗證類中使用另一個名爲org.springframework.validation.BindingResult的接口。 使用此接口,可以訪問方法getRawFieldValue(String field),並且可以讀取bean屬性的原始值。但我不明白爲什麼春季框架的更新會導致這種好奇的行爲? thx很多jose! –