1

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

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

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

控制器类中的代码

@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");

    }
4

2 回答 2

0

There were white spaces in my parameters. Using binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)) in the @InitBinder("login") solved the problem

于 2012-09-01T05:17:28.177 回答
0

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

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

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

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

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

这将修剪掉空白

于 2012-09-02T04:19:01.450 回答