1

コントローラ クラスで問題が発生しています。初めて呼び出されたときにログインページがあり、コントローラーは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");

    }
4

2 に答える 2

0

GETを使用してページが初めて要求されると、検証が機能します。これは主に、ページの要求時にフィールドが空白であり、要求されるたびにページで何かが発生する前に@InitBinder( "login")が実行されるためです。

ビューのフィールドが空白のままになっているにもかかわらず、ページがPOSTのときに検証が失敗しなかった理由は、検証がページのGETリクエストで実行され、データ中に空白のあるビューにオブジェクトが戻ったため、主に空白が原因でした。バインディング。

この問題を解決するために、検証ロジックのフィールドの長さをカウントしてサーバーに記録しました。ログを調査したところ、検証ロジックが主にNULLをチェックしていたため、フィールドがNULLではないことがわかりました。

空白の解決策:@Controller@InitBinder関数には次のものが含まれます。

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

これにより、空白が削除されます

于 2012-09-02T04:19:01.450 に答える
0

パラメータに空白がありました。@InitBinder("login") で bind.registerCustomEditor(String.class, new StringTrimmerEditor(true)) を使用すると問題が解決しました

于 2012-09-01T05:17:28.177 に答える