我使用@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 MVC似乎是通过使用最普通的情况(
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
还是有其他解决方案? 最佳答案
我们以下列方式使用异常处理程序,并且永远不会混淆顺序,并且按预期运行。
因此,如果您将其用作以下示例,则有可能解决您的问题
**********处理程序类别******************
@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;
}
}
*************** Controller 类************
@RestController("test")
@RequestMapping("/test1")
public class TestController {
@RequestMapping("/t1")
public boolean test() {
if (true) {
throw new CustomException();
}
return true;
}
}
在上面的示例中,异常Habdler是 handle2 ,因为如果没有找到,它的第1个将搜索匹配的异常,然后再寻找父级处理程序
如果我们抛出新的NullPointerException(),它将搜索匹配的处理程序,但在这种情况下找不到,然后寻找 handle1
有关更多信息,请引用here
希望对您有帮助。谢谢