我试图在Spring MVC框架下编写validators,但文档中有一个明显的遗漏。当调用向Errors对象传递错误时,大多数方法都需要一个名为errorCode的String参数。这些errorCodes,如果我理解正确,可以作为特定错误消息的替代品。但我不能为生活弄清楚这些代码的映射位置。
这是我从Spring MVC的Javadoc中引用的一个例子;
public class UserLoginValidator implements Validator {
private static final int MINIMUM_PASSWORD_LENGTH = 6;
public boolean supports(Class clazz) {
return UserLogin.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required");
UserLogin login = (UserLogin) target;
if (login.getPassword() != null
&& login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) {
errors.rejectValue("password", "field.min.length",
new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)},
"The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length.");
}
}
}
任何人都可以启发我吗?
答案 0 :(得分:16)
我正在使用默认的消息解析器。
在我的dispatcher-servlet.xml
中,我有
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
然后在我的classes目录的顶层我有一个名为“messages.properties”的文本文件,其中包含这样的映射:
error.firstname.null=Please enter your first name.
error.lastname.null=Please enter your last name.
如果您想使用自定义MessageCodesResolver,您可以实现MessageCodeResolver接口,然后为给定的控制器定义解析器,如下所示:
<bean id="myController">
<property name="messageCodesResolver" ref="myMessageCodesResolver" />
</bean>
目前没有办法在全球范围内定义自定义MessageCodeResolver
;有一个enhancement request for that here。使用bean继承来使所有控制器bean继承自一个控制器bean定义的一种方法被描述为here。
答案 1 :(得分:3)
它们由您的MessageSource和MessagesCodeResolver解决。
Here是参考手册中的相关部分:
输出与验证错误相对应的消息是我们需要讨论的最后一件事。在我们上面显示的示例中,我们拒绝了名称和年龄字段。如果我们要使用
MessageSource
输出错误消息,我们将使用我们在拒绝字段时给出的错误代码(在这种情况下为'name'和'age')。当您(直接或间接使用ValidationUtils
类)rejectValue
或Errors
接口中的其他拒绝方法之一调用时,底层实现不仅会注册你传入的代码,还有一些额外的错误代码。
答案 2 :(得分:1)
出于某种原因,如果你想解决控制器中的消息类似于form:errors jsp tags,那么你可以执行以下操作:
//result is BindingResult
List<String> errors = new ArrayList<String>();
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
String message = messageSource.getMessage(error, null);
errors.add(message);
}