首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与@ExceptionHandler或HandlerExceptionResolver相比,@ControllerAdvice在处理异常方面有什么优势?

与@ExceptionHandler或HandlerExceptionResolver相比,@ControllerAdvice在处理异常方面有什么优势?
EN

Stack Overflow用户
提问于 2016-02-10 18:30:54
回答 4查看 23.5K关注 0票数 33

Spring3.2引入了@ControllerAdvice注释,用于处理Spring应用程序中的异常。但是在这个版本之前,Spring有@ExceptionHandlerHandlerExceptionResolver来处理Spring应用程序中的异常。那么,为什么Spring3.2引入了@ControllerAdvice注释来处理异常呢?我坚信Spring3.2引入了@ControllerAdvice注释,以解决 @ExceptionHandlerHandlerExceptionResolver的限制,或者使异常处理更强的

有谁能解释@ControllerAdvice相对于@ExceptionHandlerHandlerExceptionResolver在处理异常方面的优势吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-12 20:49:55

@ExceptionHandler

@ExceptionHandler工作在控制器级别的上,它只对特定于的控制器激活,而不是对整个应用程序进行全局操作。

HandlerExceptionResolver

这将解决应用程序引发的任何异常。它用于解析它们的对应的HTTP状态代码的标准Spring异常。它没有对响应主体的控制,这意味着没有将任何东西设置到响应的主体--.It确实在响应上映射状态代码,但是主体是空。

@ControllerAdvice

用于Spring application.It中的全局错误处理的@ControllerAdvice也完全控制响应的主体和状态代码。

票数 54
EN

Stack Overflow用户

发布于 2016-02-10 19:11:53

@ExceptionHandler对控制器是本地的:只有来自该控制器的异常才被路由到他的@ExceptionHandler

但是@ControllerAdvice是全局的:您可以有一种集中的方法来处理异常、绑定等,它适用于所有定义的控制器。

票数 16
EN

Stack Overflow用户

发布于 2018-03-31 07:39:20

这里的区别是:如果我需要配置异常处理代码,那么我需要在我的项目中使用@ExceptionHandler注释,可以在两个diff.ways: 1中使用它来使用注释,并在每个控制器类中本地处理同一个控制器中的异常。例如:

代码语言:javascript
复制
@RestController
public class WSExposingController{

@GetMapping("/getAllDetails/{/id}")
public UserDetails myMethod(@PathVariable int id){
UserDetails user = UserDetailsService.getUser(id);
return user;
}

//To handle the exceptions which are resulting from this controller, I can declare an exceptionHandler specifically in the same class

@ExceptionHandler(Exception.class)
public ResponseEntity handlerSameControllerExceptions(){
return new ResponseEntity(null,HttpStatus.INTERNAL_SERVER_ERROR);

}

}

2)如果我创建一个扩展ResponseEntityExceptionHandler(SpringBoot类)的新类,如果我用@ControllerAdvice对IT进行注释,那么该类将变成globalExction处理程序,这意味着任何导致任何控制器类的异常都可以在这里处理。它可以出现在同一项目的任何包中。

代码语言:javascript
复制
@RestController
@ControllerAdvice
public class GlobalJavaExceptionHandler extends ResponseEntityExceptionHandler{

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleDiffControllerExceptions(){
        return new ResponseEntity(null,HttpStatus.INTERNAL_SERVER_ERROR);
    }

如果这两者都存在于代码中,则本地优先于全局本地。理想情况下,第二个选项是更好的选项,因为我们不需要在每个控制器类中添加代码,带有@ControllerAdvice的该类可以是一个一站式解决方案,用于解决由于代码从控制器开始到整个代码长度从控制器到dao而产生的所有异常。

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

https://stackoverflow.com/questions/35323174

复制
相关文章

相似问题

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