Spring MVC 验证错误代码在哪里解决?

Posted

技术标签:

【中文标题】Spring MVC 验证错误代码在哪里解决?【英文标题】:Where are the Spring MVC validation error codes resolved? 【发布时间】:2010-12-25 06:34:14 【问题描述】:

我正在尝试在 Spring MVC 框架下编写validators,但文档中有明显的遗漏。当调用将错误传递给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.");
       
    
 

谁能赐教?

【问题讨论】:

在 2020 年,相关文档仍然不完整 :-D docs.spring.io/spring-framework/docs/current/… 【参考方案1】:

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

在我的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;有一个enhancement request for that here。 here 描述了一种使用 bean 继承使所有控制器 bean 都从一个控制器 bean 定义继承的方法。

【讨论】:

感谢您提供的信息,这足以让我使用我的验证器。但是为了了解如果我想在自定义 MessageCodeResolver 中重新连接我会怎么做,我会去哪里?也只是为了繁荣 ResourceBundleMessageSource 的 javadoc 位于static.springsource.org/spring/docs/2.5.x/api/org/…。 如果您想使用自定义 MessageCodeResolver,您可以为给定的控制器分配一个。那么,一种方法是使用 bean 继承使所有控制器 bean 都从一个控制器 bean 定义继承,如下所述:forum.springsource.org/showthread.php?t=46336 目前没有一种方法可以全局定义自定义 MessageCodeResolver;这里有一个增强请求:jira.springsource.org/browse/SPR-5187 作为参考,全局自定义 MessageCodeResolver 功能最终在 Spring 3.1 (2011) 中实现。另见SPR-6506。【参考方案2】:

它们由您的MessageSource 和MessagesCodeResolver 解决。

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

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

【讨论】:

如果您未指定,则使用默认实例 (DefaultMessageCodesResolver)。不过,您应该只需要注册一个 MessageSource,它将自动使用。 如何注册MessageSource?我将 messageCodesResolver 视为 bean 属性。但是有没有办法将 MessageCodeResolver 设置为在整个应用程序中通用? static.springsource.org/spring/docs/2.5.x/reference/…【参考方案3】:

出于某种原因,如果您想解决 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);
   

【讨论】:

我想指出MessageSource可以在控制器中@Autowired

以上是关于Spring MVC 验证错误代码在哪里解决?的主要内容,如果未能解决你的问题,请参考以下文章

在 Freemarker 模板中显示 Spring MVC 验证错误

控制器或服务层中的 Spring MVC 验证?

Spring:如何解决验证错误->错误代码->错误消息

MVC 和 jQuery 验证,在哪里“编织”javascript 以及如何嵌入母版页?

Spring验证的错误返回------BindingResult

异常无法在 Spring MVC 中验证目标的证书