首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@ExceptionHandler的顺序

@ExceptionHandler的顺序
EN

Stack Overflow用户
提问于 2016-07-19 15:21:14
回答 3查看 13.8K关注 0票数 16

我使用@ControllerAdvice来处理我所有的应用程序异常:

代码语言:javascript
复制
@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();

代码语言:javascript
复制
   @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是一个自定义异常

代码语言:javascript
复制
public class UnauthorizedException extends Exception {

    public UnauthorizedException(){
        super();
    }

    public UnauthorizedException(String message){
        super(message);
    }
}

更新

我发现顺序是,而不是rondom,,实际上,抛出UnauthorizedException的方法正常工作,而其他方法却不工作!

代码语言:javascript
复制
@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,还是有其他解决方案?

EN

回答 3

Stack Overflow用户

发布于 2016-07-19 16:41:36

我们使用异常处理程序的方式如下,从来没有顺序,得到混合,它的工作,如预期的。因此,如果您将它用作下面的示例,那么它将解决您的问题是可能的。

*处理程序类*

代码语言:javascript
复制
@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;
    }
}

*主计长类别*

代码语言:javascript
复制
@RestController("test")
@RequestMapping("/test1")
public class TestController {

    @RequestMapping("/t1")
    public boolean test() {
        if (true) {
            throw new CustomException();
        }
        return true;
    }
}

在上面的示例中,异常哈伯德是handle2,因为它将搜索匹配的异常,如果找不到,则选择parrent处理程序。

如果我们抛出新的NullPointerException(),那么它将搜索匹配的处理程序,但在本例中找不到,那么就选择parrent,即handle1

有关更多信息,您可以参考这里

我希望它能帮到你。谢谢

票数 2
EN

Stack Overflow用户

发布于 2018-05-23 13:48:16

使用注释@Order或为实现Order接口

见以下各项的实现:

  • ExceptionHandlerMethodResolver类
  • ExceptionHandlerExceptionResolver类(方法initExceptionHandlerAdviceCache) )
  • AnnotationAwareOrderComparator类
票数 0
EN

Stack Overflow用户

发布于 2016-07-19 15:41:42

只要项目中有一个控制器通知类,就没有顺序/优先级。但是,如果您有多个控制器通知类,则可以设置顺序。但是,在这里,在您的情况下,顺序不适用,因为这两个异常的处理方式不同(即UnauthorizedException和Exception)。

好的是,Spring将自动找到相应的自定义异常类(如果有的话,否则是泛型异常)并调用相应的方法。

有关Spring建议和异常处理的更多信息,请参阅:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38462588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档