2016-07-06 14 views
0

私は、&アップデートフォームのためにSpring MVCを使用しています。 BindingResult(フォームの検証、間違った入力など)が送信されている間に、エラーメッセージを表示するために同じフォームにリダイレクトできない理由がわかりません。 POSTメソッドではなくPUTメソッド(更新事項)を使用すると発生します(追加するもの)... 私は何をすべきですか? ありがとうございます。私が受け取ったブラウザでSpring MVC PUTメソッドHTTPステータス405を取得し、別のインナナルビューへのリダイレクトに失敗しました

エラー:

HTTP Status 405 - HTTP method PUT is not supported by this URL 
type Status report 
messageHTTP method PUT is not supported by this URL 
descriptionThe specified HTTP method is not allowed for the requested resource. 
GlassFish Server Open Source Edition 4.1.1 

コンソールの何もショーアップ...私は入力のフィールドがエラーを得た上映を行うだけで、ログ。

ここでは、コントローラ内部のメソッド:PUTメソッドを使用している間

//Add - no problem can show validation error message in the JSP form 
@RequestMapping(value = "/userDetail", method = RequestMethod.POST) 
public String saveUserDetail(@Valid UserDetail userDetail, 
     Errors errors) { 
    if (errors.getErrorCount() > 0) { 
     log.info("User attempt create user: " + userDetail.toString()); 
     for (FieldError error : errors.getFieldErrors()) { 
      log.info(error.getField() + ": " + error.getDefaultMessage()); 
     } 
     //redirect to same page to show error return infor (NotEmpty etc...) 
     return "/user/inputUserDetail"; //same structure for PUT method below, but not working show me 405 error 
    } else { 
     try { 
      userDetailService.addUserDetail(userDetail); 
     } catch (Exception e) { 
      log.error("Failed to add new UserDetail: " + userDetail.toString()); 
     } 
     return "redirect:/user/userDetails"; 
    } 
} 

//Update - need UserDetail model attribute 
@RequestMapping(value = "/userDetail", method = RequestMethod.PUT) 
public ModelAndView updateUserDetail(@Valid UserDetail userDetail, 
     Errors errors, Map<String, Object> map) { 
    if (errors.getErrorCount() > 0) { 
     log.info("User attempt update user: " + userDetail.toString()); 
     for (FieldError error : errors.getFieldErrors()) { 
      log.info(error.getField() + ": " + error.getDefaultMessage()); 
     } 
     //I want to redirect to same form but show validation of previous inputted got error (NotEmpty, Email, typeMissMatch etc...) 
     //Below tested all failed 

     //Use this when return type is String 
     //return "/user/inputUserDetail"; //405 error 
     //return inputUserDetail(map); //405 error, direct call another method in same controller to show update form 
     //return "redirect:/user/userDetail/" + userDetail.getUdId(); //ok, but this one is redirect, no current errors bind to the update form 

     //Use this when return type is ModelAndView 
     map.put(BindingResult.MODEL_KEY_PREFIX + "userDetail", errors); 
     map.put("userDetail", userDetail); 

     ModelAndView mv = new ModelAndView(); 
     mv.addObject(new RedirectView("FaddistWardrobe/user/userDetail")); 
     mv.addAllObjects(map); 
     return mv; 
    } else { 
     try { 
      //update user detail 
      userDetailService.updateUserDetail(userDetail); 
     } catch (Exception e) { 
      log.error("Failed to update UserDetail: " + userDetail.toString()); 
     } 
     //This one okay can perform while form data correct 
     //If return String like above method, result same, both ok 
     return new ModelAndView("redirect:/user/userDetails"); 
    } 
} 

私はそれが可能であるかわからない、更新のユーザーのためのREST URLスタイルのPUT方法に従うマッピングは、内部JSPを呼び出すことはできませんか?または私はPUTメソッドのセットアップのために逃している任意の構成ですか?

が&に感謝 すでにorg.springframework.web.filter.HiddenHttpMethodFilter構成されたこのWebアプリケーションは... ホープ誰かが再び...感謝を助けて...私はちょうど春のMVCを学ぶために始めた、任意の提案を歓迎します。問題は、PUTのように実行しようとしている

+0

リダイレクトするのではなく、代わりにビューをレンダリングする必要があるためです。リダイレクトはクライアント側であり、同じURLにGETすると、すべてのメッセージエラーなどが再び緩和されます。 –

+0

私はまだ春の仕組みがわかりません。ページのレンダリング方法は分かりますか?これは直接コール=>リターン "/ user/inputUserDetail"です。 –

+0

WEB-INF内のこのjsp戻りページは、ユーザーフォーム(POSTメソッド)を追加しようとすると機能しますが、ユーザーフォーム(PUTメソッド)は更新されません。 –

答えて

0

=>リダイレクト=>(

は、(1)それはPUTのように実行するための試行は、正しいデータを追加するとき、コード大丈夫上記=>リダイレクト=>

をGET PUT

//Update - need UserDetail model attribute 
@RequestMapping(value = "/userDetail", method = RequestMethod.PUT) 
public String updateUserDetail(@Valid UserDetail userDetail, 
     Errors errors, Map<String, Object> map, 
     final RedirectAttributes redirectAttributes) { 
    if (errors.getErrorCount() > 0) { 
     //log.info("User attempt update user: " + userDetail.toString()); 
     for (FieldError error : errors.getFieldErrors()) { 
      log.info(error.getField() + ": " + error.getDefaultMessage()); 
     } 
     //redirect to same page to show error return infor (NotEmpty etc...) 
     redirectAttributes.addFlashAttribute("userDetail", userDetail); 
     redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "userDetail", errors); 
     return "redirect:/user/userDetail/error"; 
    } else { 
     try { 
      //update user detail 
      userDetailService.updateUserDetail(userDetail); 

     } catch (Exception e) { 
      String tmp = e.getLocalizedMessage(); 
      String tmp2 = e.toString(); 
      //log.error("Failed to update UserDetail: " + userDetail.toString()); 
     } 
     return "redirect:/user/userDetails"; 
    } 
} 


//Display form with validation error after update fail (PUT -> Redirect -> GET) 
@RequestMapping(value = "/userDetail/error", method = RequestMethod.GET) 
public String inputUserDetail_error() { 
    //Here will auto retrieve previous redirectAttributes data and put into the JSP page. 
    return "/user/inputUserDetail"; 
} 

ちょうど私達:2)PUTメソッドを使用して

ソリューション=>が=>コーディング以下のようにGETリダイレクト置くために変更されるため、同じページに表示エラーをしようとする失敗redirectAttributesは一時的なモデルを格納し、リダイレクト後のユーザが以前のモデルを取り戻して使用することができます。 このソリューションでSpringMVCに新鮮な他のヘルプがあります。おかげさまで

関連する問題