关于MultiActionController的Spring验证,BindException:如何使用自定义对象名而不是命令

时间:2013-02-01 03:07:25

标签: java spring-mvc validation

抱歉我的愚蠢问题和糟糕的英语。 我尝试使用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”。当我尝试将该commandName更改为“command”时,它可以工作。但我只是好奇是有一些方法在BindException类中setObjectName或你有另一种方法来使用自定义名称而不是默认的“命令”对象名称??

更新

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

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

当然也在我的控制器中进行一些调整。如果我把它换成另一个名字它就不再工作了。

我使用Spring Framework 3.0.2 RELEASE。

1 个答案:

答案 0 :(得分:0)

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

你正在使用什么版本的弹簧?从基类开始,“命令”的概念现在相对过时了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