コントローラ クラスで問題が発生しています。初めて呼び出されたときにログインページがあり、コントローラーはGETリクエストで注釈が付けられたメソッドを使用します。フォームが投稿されると、POST リクエストで注釈が付けられたメソッドが使用されます。
フォームが投稿されたときだけバリデーションを実行したい。そのため、検証チェックは POST メソッド (@Valid) に配置されます。@InitBinder 関数がありますが、フォームを POST したときにこれが実行されないため、Validation クラスからエラー メッセージが返されることも、「result.hasErrors()」メソッドが false に設定されることもありません。@Valid を GET に配置すると、検証が行われ、result.hasErrors() が false に設定されます。
@InitBinder 関数がいつ実行されるか、または POST の要求でのみ実行を許可する方法がわかりません。現在、ページがGETのときに実行される唯一のメッセージは、「Welcome it was a 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");
}