我使用@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

希望对您有帮助。谢谢

10-08 01:11