我使用@ControllerAdvice来处理我所有的应用程序异常:
@ControllerAdvice
public class ExceptionHandlingController {
@ExceptionHandler({UnauthorizedException.class})
public String unauthorizedException() {
.........
}
@ExceptionHandler({UnauthorizedAjaxException.class})
@ResponseBody
public void unauthorizedAjaxException() {
.........
}
@ExceptionHandler({Exception.class})
public String globalException(){
.........
}
}在我的代码中,我做了throw new UnauthorizedException();
@Around("@annotation(Authenticated)")
public Object profilingAuthentication(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
if( request.getSession().getAttribute("idContact") == null ) {
if( "XMLHttpRequest".equals(request.getHeader("X-Requested-With")) )
throw new UnauthorizedAjaxException();
throw new UnauthorizedException();
}
return pjp.proceed();
}但遗憾的是,Spring似乎是通过使用最通用的案例(Exception)而不是更具体的案例(例如UnauthorizedException)来随机操作的。有时他会选择正确的!
订单是如何工作的?有什么办法来指定订单吗?
UnauthorizedException是一个自定义异常
public class UnauthorizedException extends Exception {
public UnauthorizedException(){
super();
}
public UnauthorizedException(String message){
super(message);
}
}更新
我发现顺序是,而不是rondom,,实际上,抛出UnauthorizedException的方法正常工作,而其他方法却不工作!
@Authenticated
@RequestMapping(value="/favoris")
public String favoris(ModelMap model, HttpServletRequest request)
throws UnauthorizedException {
....
}
@Authenticated
@RequestMapping(value="/follow")
public String follow(ModelMap model, HttpServletRequest request) {
.....
}所以我必须手动添加throws UnauthorizedException,还是有其他解决方案?
发布于 2016-07-19 16:41:36
我们使用异常处理程序的方式如下,从来没有顺序,得到混合,它的工作,如预期的。因此,如果您将它用作下面的示例,那么它将解决您的问题是可能的。
*处理程序类*
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value = Exception.class)
public boolean handle1(Exception exc) {
System.out.println("#####Global Exception###" + exc);
exc.printStackTrace(System.out);
return true;
}
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value = CustomException.class)
public boolean handle2(CustomException exc) {
System.out.println("###custom exception######" + exc);
exc.printStackTrace(System.out);
return true;
}
}*主计长类别*
@RestController("test")
@RequestMapping("/test1")
public class TestController {
@RequestMapping("/t1")
public boolean test() {
if (true) {
throw new CustomException();
}
return true;
}
}在上面的示例中,异常哈伯德是handle2,因为它将搜索匹配的异常,如果找不到,则选择parrent处理程序。
如果我们抛出新的NullPointerException(),那么它将搜索匹配的处理程序,但在本例中找不到,那么就选择parrent,即handle1
有关更多信息,您可以参考这里
我希望它能帮到你。谢谢
发布于 2018-05-23 13:48:16
使用注释@Order或为实现Order接口
见以下各项的实现:
发布于 2016-07-19 15:41:42
只要项目中有一个控制器通知类,就没有顺序/优先级。但是,如果您有多个控制器通知类,则可以设置顺序。但是,在这里,在您的情况下,顺序不适用,因为这两个异常的处理方式不同(即UnauthorizedException和Exception)。
好的是,Spring将自动找到相应的自定义异常类(如果有的话,否则是泛型异常)并调用相应的方法。
有关Spring建议和异常处理的更多信息,请参阅:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
https://stackoverflow.com/questions/38462588
复制相似问题