当前位置: 首页 > 知识库问答 >
问题:

与@ExceptionHandler或HandlerExceptionResolver相比,@ControlllerAdures在处理异常方面有哪些优势?

羊舌洛华
2023-03-14

Spring3.2引入了@ControllerAdvice注释,用于处理SpringMVC应用程序中的异常。但在此版本之前,Spring有@ExceptionHandlerHandlerExceptionResolverSpring MVC应用程序中的异常处理。那么为什么Spring3.2引入@ControllerAdvice注释来处理异常呢?我坚信,Spring 3.2引入了@ControllerAdvice注释,以解决@ExceptionHandler >的局限性,或使异常处理更加强大。

有人能解释一下@ControlllerAdwit相对于@ExceptionHandlerHandlerExceptionResolver处理异常的优势吗?

共有3个答案

师谦
2023-03-14

区别在于:如果我需要配置异常处理代码,那么我需要在我的项目中使用@ExceptionHandler注释,它可以有两种不同的方式使用:1)在每个控制器类中使用注释并在本地处理同一控制器中的异常。例如:

@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通知它,那么该类将成为globalexceptionhandler,这意味着任何导致任何控制器类的异常都可以在这里处理。它可以出现在同一项目的任何包中。

@RestController
@ControllerAdvice
public class GlobalJavaExceptionHandler extends ResponseEntityExceptionHandler{

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

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

胡翔
2023-03-14

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

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

张炳
2023-03-14

@ExceptionHandler在控制器级别工作,它仅对该特定控制器有效,而不是对整个应用程序全局有效。

这将解决应用程序引发的任何异常。它用于将标准Spring异常解析为其相应的 HTTP 状态代码。它无法控制响应的正文,这意味着它不会对响应的正文设置任何内容,Response.It 确实映射了响应上的状态代码,但正文为 null。

< code>@ControllerAdvice用于Spring MVC应用程序中的全局错误处理。它还可以完全控制响应正文和状态代码。

 类似资料:
  • 我有例外: 其他自定义异常从它继承: 处理它们。现在看起来就像是在那里: ExceptionHandler正确处理所有自定义异常,排除 在验证jwm-token时,此异常只在一种情况下抛出。 这样,Console中有3个stacktraces日志: 仅前端重装 请告诉我,怎么了。 附注。完整StackTrace: null 2019-07-14 17:04:38.791错误24060---[nio

  • 本文向大家介绍HTML5相比于HTML4有哪些优势?相关面试题,主要包含被问及HTML5相比于HTML4有哪些优势?时的应答技巧和注意事项,需要的朋友参考一下 1.更强的语义化 2.更丰富的功能,比如 3.更简洁的模板语法

  • “如何根据员工对象的id或名称对集合进行排序”。为此,我们可以使用两个接口,即这似乎是常见的面试问题之一 但是我看不出为什么我应该同时使用这两个来对employee对象进行排序 我一直在思考实现了无法实现的功能。我明白,如果对象(所比较的实例变量)具有自然顺序,那么是正确的选择。但是,如果需要自定义排序(例如字符串长度),那么可以编写这里我的观点是,只有当客户机希望按照其他条件对数据进行排序时才需

  • 本文向大家介绍JDK7中引入了哪些与Java异常处理相关的更改?,包括了JDK7中引入了哪些与Java异常处理相关的更改?的使用技巧和注意事项,需要的朋友参考一下 自从引入Java 7 try-with资源以来。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在try块的末尾) 我们在try块中声明的资源应扩展java.lang.AutoCloseable类。 示例

  • 问题内容: 在Java中有and 。 对于我刚来的时候,在处理头脑方面我有一个愚蠢的怀疑。我们写来处理。所以,我们可以写return语句和网页的名称,显示/ 。 如果我抛出在文件中声明的内容,结果是重定向到/ 页面怎么办? 两者都是检查异常的正确方法吗? 问题答案: 应捕获应用程序级别的异常。如果抛出应用程序级异常并且没有捕获到它,那么如果将其配置为操作,则拦截器可能会捕获到它。请注意,异常拦截器

  • 本文向大家介绍axios相比原生ajax的优点有哪些呢?相关面试题,主要包含被问及axios相比原生ajax的优点有哪些呢?时的应答技巧和注意事项,需要的朋友参考一下 从 node.js 创建 http 请求 在浏览器中创建 XMLHttpRequests 支持 Promise API 提供了一些并发请求的接口(重要,方便了很多的操作) 支持拦截请求和响应 转换请求和响应数据 取消请求 自动转换