如何在控制器方法内引发异常时重定向到同一页面。这是我的代码。
这是我的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)
请提出任何想法 感谢。
答案 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
中找到相关参考