2016-06-27 9 views
0

コントローラメソッド内で例外が発生したときに同じページにリダイレクトする方法。ここに私のコードです。Exceptionalハンドラメソッドから同じページへのリダイレクション

これは私のUserControllerでクラス

@Controller 
public class UserController{ 

@Autowired 
private UserService userService; 

@RequestMapping("/user/{userId}")  
public ResponseEntity<UserDto> loadUserById(@PathVariable("userId" int userId){ 

     UserDto user=userService.loadUserByUserId() int userId); 
     if(user==null){ 
        throw new UserNotFoundException("No user found with this id"); 
        } 
      return user; 

    } 

    @ExceptionHandler(UserNotFoundException.class) 
    public String handleUserNotFoundException(){ 

     // here i want to redirect to the same page from which the request was coming with some message like "with this id user is not found" 
    } 
} 

ですが、どういうわけか、私は「referal」ヘッダー名を使用して例外ハンドラメソッドで元の要求のURLを取得するためのURLを取得します。 「リファラー」を使用して、リクエストの発信元を特定できます。 は、ここで再び、ここで私が注意

@ExceptionHandler(UserNotFoundException.class) 
public String handleUserNotFoundException(HttpServletRequest request, RedirectAttributes attributes){ 
    String uri=request.getHeader("referer"); 
    // now i want to redirect that uri 
    return "redirect:"+uri; 
} 

のサンプルコードは以下のようなRedirectAttributesを使用する必要があり、そのためにURIにいくつかのメッセージを送りたいという

@ExceptionHandler(UserNotFoundException.class) 
public String handleUserNotFoundException(HttpServletRequest request){ 
    String uri=request.getHeader("referer"); 
    // now i want to redirect that uri 
    return "redirect:"+uri; 
} 

でものために私のコードです:どこかは、私が話を聞きました例外ハンドラメソッドの引数の制限。 RedirectAttributesをException Handlerメソッドに追加することはできません。そうした場合、そのメソッドは例外が発生したときにSpringによって無視されます。

そして、リダイレクトコードをリクエストハンドラメソッド(loadUserById(int)など)に書きたくありません。 Bcoz私はそうする場合、私は例外が発生するすべてのコントローラメソッドで同じコードを記述する必要があります。私の疑問は

1)は例外ハンドラメソッド

2にリダイレクトプロセスに私のメッセージ情報を設定するための任意の別の方法があることは何であるかそう 、)私はソースを取得するには、「referal」を使用することができます(正確なURIを返します)

何か考えてください、 ありがとうございました。

答えて

0

非同期JavaScriptリクエストを使用してユーザーを読み込むことができます。ここでは、角度での基本的な例は次のとおりです。

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
<body> 
    <div ng-app="myApp" ng-controller="myCtrl"> 
     <h1>Angular async example</h1> 
     <span ng-if="error"> 
      {{error}} 
     </span> 
     <br/> 
     <span ng-model="user.name">{{user.name}}</span> 
     <!--populate data as you wish --> 
    </div> 

    <script> 
    var app = angular.module('myApp', []); 
    app.controller('myCtrl', ['$scope','$http',function($scope, $http) { 
     $scope.user=null; 
     $http.get('/user/' + 1) // you can get id from somewhere else 
      .success(function(data){ 
       $scope.user = data; 
      }).error(function(data){ 
       $scope.error = data; 
      }); 
    }]); 
    </script> 
</body> 
</html> 

この例では、適切なサーバーで動作します。それは単なる概念の証明です.JavaScriptのアプローチを適応させるためには、もっと多くのことを行う必要があります。

0

コントローラーメソッドのRedirectAttributesパラメーターは、SpringのMVCのFlashコンセプトの素晴らしいラッパーです。そこでは一般的に使用されているように、Springフェローは単に使いやすいと思っていました。

しかし、フラッシュは常に利用可能です。単に、静的メソッドの出力フラッシュマップを明示的に要求する必要があります(RequestContextUtils)。

@ExceptionHandler(UserNotFoundException.class) 
public String handleUserNotFoundException(HttpServletRequest request){ 
    String uri=request.getHeader("referer"); 

    // Get the output flash mapp 
    Map<String, Object> flash = RequestContextUtils.getOutputFlashMap(request); 
    // populate the flash map with attributes you want to pass to redirected controller 

    // now i want to redirect that uri 
    return "redirect:"+uri; 
} 

あなたは、他のanswer of mine

にそのための参照を見つけます
関連する問題