27

我正在尝试在 Spring MVC 框架下编写验证器,但文档中有一个明显的遗漏。当调用将错误传递给Errors对象时,大多数方法都需要一个名为 errorCode 的字符串参数。如果我理解正确,这些错误代码可以作为特定错误消息的替代品。但我无法终生弄清楚这些代码映射到哪里。

这是我从 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.");
       }
    }
 }

任何人都可以启发我吗?

4

3 回答 3

17

我正在使用默认的消息解析器。

在我的dispatcher-servlet.xml,我有

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages" />
</bean>

然后在我的类目录的顶层,我有一个名为“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全局范围内定义自定义;这里有一个增强请求这里描述了一种使用 bean 继承使所有控制器 bean 都从一个控制器 bean 定义继承的方法。

于 2009-12-10T15:42:26.713 回答
3

它们由您的MessageSourceMessagesCodeResolver解析。

以下是参考手册中的相关部分:

输出与验证错误对应的消息是我们需要讨论的最后一件事。在上面显示的示例中,我们拒绝了姓名和年龄字段。如果我们要使用 a 输出错误消息MessageSource,我们将使用我们在拒绝字段时给出的错误代码(在本例中为“name”和“age”)。当您从接口调用(直接或间接,例如使用ValidationUtils类)rejectValue或其他拒绝方法之一时Errors,底层实现不仅会注册您传入的代码,还会注册一些额外的错误代码.

于 2009-12-10T14:25:10.197 回答
1

出于某种原因,如果您想解析 Controller 中类似于 form:errors jsp 标签的消息,那么您可以执行以下操作:

   //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);
   }
于 2012-01-04T06:38:44.513 回答