【问题标题】:Spring Validation on MultiActionController, BindException : how to use custom object name instead of commandMultiActionController,BindException上的Spring验证:如何使用自定义对象名称而不是命令
【发布时间】:2013-01-16 08:08:05
【问题描述】:

对不起,我的问题很愚蠢,英语不好。 我尝试使用 Spring MVC 在我的新开发 Web 中对用户更改密码菜单进行一些验证。

我听从How to perform Spring validation in MultiActionController?的指示

我写了这段代码:

public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
    BindException bindException = (BindException) bindingException.getRootCause();
    ModelMap modelmap = new ModelMap();
    ChangePasswordForm cpForm = new ChangePasswordForm();
    cpForm.setUsername(SessionHelper.getUsername());
    modelmap.addAttribute("ChangePasswordForm", cpForm);
    return new ModelAndView("changepassword").addAllObjects(bindException.getModel()).addObject("ChangePasswordForm", cpForm);
}     

在我的jsp中:

<form:form action="update.htm" commandName="ChangePasswordForm" >
    <form:errors path="*" cssClass="errorblock" element="div" />
    <table  class="form">
        <tr>
            <td class="col1"><label>User Name :</label></td>
            <td class="col2"><form:label path="username" >${ChangePasswordForm.username}</form:label></td>
        </tr>
        <tr>
            <td><label>Old Password :</label></td>
            <td><form:password path="oldPassword" id="oldPassword"></form:password>
                <form:errors path="oldPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td><label>New Password :</label></td>
            <td><form:password path="newPassword"></form:password>
            <form:errors path="newPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td><label>Confirm New Password :</label></td>
            <td><form:password path="confirmNewPassword"></form:password>
            <form:errors path="confirmNewPassword" cssClass="error" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="submit" ></td>
        </tr>
    </table>
</form:form>    

但是当我尝试像空字段这样的否定测试时,它不会在我的屏幕上出现任何错误。 当我尝试打印出来时

System.out.println("UserController::hanldeBindException::1" + bindException.getObjectName());

它显示对象名称是“command”,而不是我在 jsp 中的命令名称是“ChangePasswordForm”。当我尝试将该命令名更改为“命令”时,它可以工作。但我只是好奇是否有一些方法可以在 BindException 类中设置对象名,或者你有另一种方法来使用自定义名称而不是默认的“命令”对象名称??

更新

我的验证有效,因为我将 commandName 更改为“command”,如下所示:

<form:form action="update.htm" commandName="command">
   <!-- Form Field and Error define here -->
</form:form>

当然也可以在我的控制器中进行一些调整。如果我将其更改为另一个名称,它将不再起作用。

我使用 Spring Framework 3.0.2 RELEASE。

【问题讨论】:

    标签: java spring-mvc validation


    【解决方案1】:

    简单的答案是您很可能正在以某种形式(AbstractCommandController 或其他)扩展 BaseCommandController,在这种情况下,您可能应该覆盖“getCommandName()”和“getCommand()”方法。但我无法从你提供的代码中看出。

    你用的是什么版本的spring?从 3.0+ 开始,“命令”的概念和基类一样已经过时了。而是使用基于注解的控制器和模型属性:

    @Controller
    @SessionAttributes({"changePasswordForm"})
    public class MyController {
        @InitBinder
        public void initBinder(WebDataBinder binder) {
           binder.setValidator(new ChangePasswordFormValidator());
        }
    
        @ModelAttribute("changePasswordForm")
        public ChangePasswordForm createChangePasswordForm() {
          ...
        }
    
    
        @RequestMapping(...)
        public ModelAndView controllerMethod(
              @Valid @ModelAttribute changePasswordForm ChangePasswordForm) {
          ...
        }
    }
    

    这应该会在调用控制器方法之前自动验证您的表单,并返回到调用页面。

    在您的验证器中,您将在 validate 方法中提供错误消息代码:

    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "username.required");
    }
    

    然后,您将确保“username.required”是您提供给 spring 的任何 MessageSource 中的键。

    表单标签应该完全按照你的方式工作。

    这是控制器的弹簧参考手册:

    http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-controller

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2013-02-19
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多