自从我的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值...
答案 0 :(得分:1)
好像你有一个绑定错误所以getFieldValue()
返回FieldError.getFieldValue()
返回导致绑定错误的值。这是预期的行为。
您可以使用getRawFieldValue()
获取保存属性的值。此方法始终使用PropertyAccessor
返回值。