Spring 3.1.1.RELEASE Databinding:验证提交的表单时出错

时间:2012-05-14 18:31:05

标签: java spring validation spring-mvc

自从我的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属性的标准方法。错误仅在非String值上发生,例如属性为Integer的age。它也发生在Collection(s)上。

以下代码段显示了如何在我的utils-class中验证Integer值:

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,以实现与3.0.5中相同的bevahior?

编辑:方法“getFieldValue(...)”的官方Spring Doku

  

返回给定字段的当前值,即当前bean属性值或上次绑定中的拒绝更新。

所以我不知道为什么这个方法返回一个String-value而不是Integer类型的传播bean值...

1 个答案:

答案 0 :(得分:1)

好像你有一个绑定错误所以getFieldValue()返回FieldError.getFieldValue()返回导致绑定错误的值。这是预期的行为。

您可以使用getRawFieldValue()获取保存属性的值。此方法始终使用PropertyAccessor返回值。