2012-09-01 36 views
1

我在Controller類中遇到了一些問題。第一次調用時,我有一個Login頁面,Controller使用用GET請求註釋的方法。當表單發佈後,它將使用POST請求註釋的方法。SpringMVC驗證問題

只有當表單發佈時,我想執行驗證。所以驗證檢查放在POST方法(@Valid)中。我有一個@InitBinder函數,但是當POST表單沒有被執行時,所以沒有從Validation類返回錯誤消息,也沒有將'result.hasErrors()'方法設置爲false。如果我將@Valid放在GET上,我會得到驗證意味着result.hasErrors()被設置爲false。

我不知道什麼時候@InitBinder函數被執行或者如何只允許執行POST請求。目前,當頁面爲GET時,唯一被執行的消息是「歡迎它是一個get」,這正是我想要的,但是我得到'POST錯誤!這是一個帖子',驗證沒有得到執行。在一些代碼:

代碼在GET控制器類

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

} 

我沒有做任何事情,除了顯示頁面

@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

有在我的參數中是空白的。在@InitBinder(「login」)中使用binder.registerCustomEditor(String.class,new StringTrimmerEditor(true))解決了問題

+0

然後,接受你自己的問題:) – jelies

+1

不能接受兩個,直到幾天後那就是它所說的 – devdar

0

第一次使用GET請求驗證工作時,這主要是因爲字段在頁面請求時爲空,@InitBinder(「登錄」)將在每次請求時在頁面上發生任何事情之前執行。

雖然視圖中的字段留空,但頁面爲POST時,驗證沒有失敗的原因主要是由於驗證在頁面GET請求上運行時出現空白,並且將對象返回給視圖數據綁定期間的空白空間。

爲了彌補這個問題,我做了驗證邏輯中的字段長度的計數並將其記錄到服務器上。當日志被調查時,我看到字段不是NULLS,因爲驗證邏輯主要檢查NULLS 。

解決方案空格:在@Controller @InitBinder功能包括:

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

這將修剪掉空格