3

自从将我的 web 应用程序从 Spring 3.0.5 升级到 3.1.1 后,在验证我的表单 bean 时,我不得不面对一些严重的错误。我之前配置的验证器不再像他们应该的那样工作。问题是来自 Class org.springframework.validation.Errors的方法getFieldValue(String fieldname)没有像它应该(和以前一样)返回原始绑定的 bean 值。

这就是我的 form-b​​ean 的样子:

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 属性的标准方法。该错误仅发生在非字符串值上,例如整数类型的属性年龄。它也发生在集合上。

以下代码段显示了如何在我的 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 来实现与 3.0.5 中相同的行为?

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

返回给定字段的当前值,可以是当前 bean 属性值,也可以是上次绑定的拒绝更新。

所以我不知道为什么这个方法返回一个字符串值而不是整数类型的传播 bean 值......

4

1 回答 1

1

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

您可以改为使用获取持有该属性的值getRawFieldValue()。此方法始终使用PropertyAccessor.

于 2012-05-15T19:04:46.973 回答