SpringMVC验证问题

时间:2012-09-01 04:26:14

标签: java spring spring-mvc validation

我在Controller类中遇到了一些问题。我第一次调用时有一个Login页面,Controller使用带有GET请求注释的方法。当表单发布时,它将使用带有POST请求注释的方法。

只有在发布表单时我才想执行验证。因此验证检查放在POST方法(@Valid)中。我有一个@InitBinder函数但是当我对表单进行POST时这不会被执行,因此Validation类没有返回错误消息,也没有将'result.hasErrors()'方法设置为false。如果我将@Valid放在GET上,我就会发生验证,这意味着result.hasErrors()被设置为false。

我不确定何时执行@InitBinder函数或如何仅允许在POST请求时执行。目前唯一的消息,当页面是GET时执行是'欢迎它是一个得到'这是我想要的,但POST我得到'错误!这是一个帖子'并且验证没有被执行。下面是一些代码:

Controller类中的代码

@InitBinder("login")
protected void initBinder(WebDataBinder binder){
    binder.setValidator(new LoginValidation());

}

除了显示页面

之外,我在GET中没有做任何事情
@RequestMapping(value="login.htm", method=RequestMethod.GET)
 public ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,Model model, @ModelAttribute("login") Login login,BindingResult result )
            throws ServletException {

            return new ModelAndView("login","errorMsg", "Welcome it was a get");             


}

@RequestMapping(value="login.htm", method=RequestMethod.POST)
public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response, @Valid @ModelAttribute Login login, BindingResult result, ModelMap m) throws Exception {



         if(result.hasErrors()){


             return new ModelAndView("login", "errorMsg", "Errors was detected");

        }else{

            if (authenticationManager.Authenticate(login) == true){

                return new ModelAndView("main","welcomeMessage", message);
            }           

            return new ModelAndView("login","errorMsg", "Error!!! It was a post");

    }

2 个答案:

答案 0 :(得分:0)

我的参数中有空格。在@InitBinder(“login”)中使用binder.registerCustomEditor(String.class,new StringTrimmerEditor(true))解决了问题

答案 1 :(得分:0)

第一次使用GET请求页面验证有效时,这主要是因为在页面请求时字段是空白的,并且@InitBinder(“login”)将在页面上每次发生任何事情之前执行请求。

即使视图中的字段留空,当页面为POST时验证未失败的原因主要是由于白色空格,因为验证在页面GET请求上运行并将对象返回到具有白色的视图数据绑定期间的空格。

为了解决这个问题,我计算了验证逻辑中字段的长度,并将其记录到服务器。当日志被调查时,我看到字段不是NULLS,因为验证逻辑主要检查NULLS。

空格的解决方案:在@Controller @InitBinder函数中包括:

binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));

这将削减空白