我在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");
}
答案 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));
这将削减空白