2016-05-27 17 views
0

ExceptionHandlerウィジェットのモデルアトリビュートから発生したサイトにリダイレクトしようとしました。例えばコントローラのアドバイスでリダイレクトするモデルアトリビュートスプリングのMVC

iは制御方式魔女リストを現在のアイテムがあります

@AvailableInMenu 
@RequestMapping(method = RequestMethod.GET) 
public String list(Model model) { 
    model.addAttribute("Companys", iCompanyService.findAll().getData()); 
    return "masters/crud/company/list"; 
} 

アンこのテンプレート魔女であるメソッド呼び出し:

<div th:if="${exception != null}" class="alert alert-warning alert-dismissible" role="alert"> 
     <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
     <strong>Warning!</strong><div th:text="${exception}" th:remove="tag" ></div> 
    </div> 

    <div class="ibox float-e-margins"> 
     <div class="ibox-content"> 
      <table id="table" class="table table-striped table-bordered nowrap"> 
       <thead> 
        <tr> 
         <th th:text="#{app.maintanance.installversion}"></th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr th:each="company : ${Companys}"> 
         <td th:text="${company.installversion}"></td> 
         <td> 
          <a class="delete-button" th:attr="[email protected]{/company/delete/{id}(id = ${company.id})}"> 
           <i class="fa fa-pencil"></i> 
          </a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </div> 
    </div> 

このthymeleafコードは、データを持つテーブルを生成し削除リンク。ユーザーが使用する外部キーには外部キーがあり、ユーザーが削除したい場合は外部キー制約ウィンドウがエラーラッパーにラップされます。私は私が作成し、一般的な例外をスローし、エラーがあった場合、あなたが見ることができるように

@RequestMapping(value = {"/delete/{id}"}, method = RequestMethod.GET) 
public String deleteCompany(Model model, @PathVariable("id") Long id) { 
    ErrorWrapper<Boolean> result = iCompanyService.deleteCompany(id); 
    if(result.hasError()){ 
     if(result.getConstraint()){ 
      throw new GlobalModelException(601L, "redirect:/company"); 
     } 
    } 
    return "redirect:/company"; 
} 

、と私expectionクラスをキャッチされExpectonHandlerとControllerAdvice:

この

は削除リンク用のコントローラメソッドです。モデルに例外を追加し、リスティングサイトにリダイレクトして、サイトのブートストラップアラートを表示したいと思います。 これは、それがあるべきとしてのModelAndViewは私に正しい場所にリダイレクトControllerAdvice

@ExceptionHandler(GlobalModelException.class) 
public ModelAndView handlingException(GlobalModelException exception) { 
    ModelAndView model = new ModelAndView(); 
    model.setViewName(exception.getUrl()); 
    model.addObject("exception", exception); 
    return model; 
} 

からexceptionHandlerのですが、例外は、リダイレクト後にNULLです。 ControllerAdviceを使用してモデル内の例外を使用してリスティングサイトに電話をかけるにはどうすればよいですか。私は、私が扱いたい他の多くの例外と、これが必要な他の多くのコントローラがあります。

これを行う方法はありますか?

+0

リダイレクトがモデルを持つことができません。あなたは、フラッシュ属性を使用する必要があります。また、削除アクションに対してGETリクエストを使用したいと思っていますか?代わりにDELETEまたはPOSTを使用してください。 –

+0

春の削除でロールベースのアクセス制御があるので、getはかなり安全で、@ExceptionHandlerではコントローラでflashattributaを使用できません。それは私が考えている最初の薄いでした – Syngularity

+0

私はそうではありませんが、悲しいかな、私はDELETEまたはPOSTを(データ変更のための良いプラクティスとして)使用するでしょう。次に、モデルの代わりにセッションに物を貼り付けます。また、例外を使用してフローを制御することは、最初にやってはいけないことですが、imhoはそうです。 –

答えて

0
+0

ModelAndViewにはRedirectAttributes/FlashAttributeがありません。また、@ExceptionHandlerはコントローラではないので、@ExceptionHandler(GlobalModelException.class) public ModelAndView handlingException(GlobalModelException例外、最終的なRedirectAttributes redirectAttributes){...} dosen'tどちらか – Syngularity

関連する問題