ホーム>source

ええ、私はそれが愚かな質問であることを知っていますが、私は過去3時間からこれに苦労しています。 ModelAndView を返したい   bindingResult.hasErrors() の場合、コントローラーから  そうでない場合は、メソッドにajax呼び出しの応答を返すようにします。 @ResponseBody でメソッドに注釈を付ける必要があることを知っています  コントローラーに応答を生成させたいが、理解できない場合メソッドがModelAndViewオブジェクト(検証が失敗した場合)または@ResponseBodyアノテーションが付けられた文字列(すべてがうまくいく場合のelse部分)を返す方法。誰かがこれについて私を案内してもらえますか?

これが私のコントローラーメソッドです。

@PostMapping("/problem/submit")
    public ModelAndView getProblemDetails(@Valid @ModelAttribute("problem") Problem problem,
                                        BindingResult bindingResult,ModelAndView modelAndView,Model model){
        modelAndView.setViewName("home");
        if(bindingResult.hasErrors()){
            return modelAndView;
        }
        else{
            //return response for ajax call where my method return type should be String and it should be annotated with @ResponseBody
        }
    }

あなたの答え
  • 解決した方法 # 1

    エイリアンが示唆したように、ここに行きます:-

    @PostMapping("/problem/submit")
    public void getProblemDetails(@Valid @ModelAttribute("problem") Problem problem,BindingResult bindingResult,HttpServletResponse response){
        try {
            JSONObject resultJson = new JSONObject();
            resultJson.put("beanValidationFailed", false);
            if(bindingResult.hasErrors()){
                resultJson.put("beanValidationFailed", true);
                //private function to get bindingResult erros as key/value Pair
                resultJson = getFieldErrors(bindingResult,resultJson); 
            }else{
                //here retrunJson object is case of no errors
            }
            //This will bind this json directly to your AJAX response
            //You can use this json object to show error( in case of bindingResult erros as well send other data if there are no error) 
            response.getWriter().write(resultJson.toString());
        }
        catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private JSONObject getFieldErrors(BindingResult bindingResult, JSONObject resultJson){
        try {
           List<FieldError> fieldErrors = bindingResult.getFieldErrors();
           for ( FieldError error: fieldErrors) {
              resultJson.put(error.getField(),error.getDefaultMessage());
           } 
        }catch (JSONException e) {
            e.printStackTrace();
        }
        return resultJson;
    }
    
    

  • 解決した方法 # 2

    簡単な言葉でできません それを行う。

    あなたは javascript/jquery で行くことができます  検証。すべてが正常に検証された場合、そうでない場合はフォームを送信します。

    または、コントローラーからバインディングエラーが返されない場合は、ビューページにロジックを書き込みます。

    http://www.raistudies.com/spring/spring-mvc/ajax-spring-mvc-3-annonations-jquery/

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ android - ブート完了後にOreoでフォアグラウンドサービスを開始する方法は?