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

2022-09-01 14:43:05

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

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

任何人都可以启发我吗?


答案 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>

目前没有办法全局定义自定义;这里有一个增强请求这里描述了一种使用bean继承使所有控制器Bean从一个控制器Bean定义继承的方法。MessageCodeResolver


答案 2

它们由您的消息源消息代码解析器解析

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

输出与验证错误相对应的消息是我们需要讨论的最后一件事。在上面显示的示例中,我们拒绝了名称和年龄字段。如果我们要使用 a 输出错误消息,我们将使用拒绝字段时给出的错误代码(在本例中为“name”和“age”)来执行此操作。当您从接口调用(直接或间接地,使用例如类)或其他拒绝方法之一时,基础实现不仅会注册您传入的代码,还会注册许多其他错误代码。MessageSourceValidationUtilsrejectValueErrors


推荐