从异常处理程序方法重定向到同一页面

时间:2016-06-27 07:26:13

标签: spring-mvc

如何在控制器方法内引发异常时重定向到同一页面。这是我的代码。

这是我的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"
    }
}

但不知何故,我得到了使用&#34; referal&#34;在异常处理程序方法中获取原始请求URL的URL。标题名称。使用&#34; referer&#34;我们可以确定请求的来源。 这是我的代码

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

但是在这里我想向uri发送一些消息因为我必须使用RedirectAttributes,如下面的代码示例

@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;
}  

注意:在某处我听说过对Exception处理程序方法的参数的限制。即我们无法在异常处理程序方法上添加RedirectAttributes。如果我们这样做,那么当引发异常时,Spring将忽略该方法。

我不想在请求处理程序方法中编写重定向代码(即在loadUserById(int)中)。 Bcoz如果我这样做,我必须在引发异常的所有控制器方法中编写相同的代码。 所以,我怀疑的是

1)有没有其他方法可以在Exception处理程序方法中将消息信息设置为重定向过程

2)我可以使用&#34; referal&#34;获取请求的来源(总是返回正确的uri)

请提出任何想法 感谢。

2 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分: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

中找到相关参考