Raj*_*Roy 20 java spring exception-handling spring-mvc
Spring 3.2引入了@ControllerAdvice用于处理Spring MVC应用程序中的异常的注释.但在此版本之前,Spring已经@ExceptionHandler或正在HandlerExceptionResolver处理Spring MVC应用程序中的异常.那么为什么Spring 3.2引入了@ControllerAdvice用于处理异常的注释?我坚信,春3.2引入了@ControllerAdvice注释,以解决限制 @ExceptionHandler或HandlerExceptionResolver或使例外处理更强.
任何人都可以解释@ControllerAdvice超过@ExceptionHandler或HandlerExceptionResolver处理异常的优点吗?
Bac*_*ria 30
@ExceptionHandler在Controller级别工作,它仅对该特定Controller有效,而不是对整个应用程序全局有效.
这将解决应用程序抛出的任何异常.它用于将标准Spring异常解析为其相应的HTTP状态代码.它无法控制响应的主体,意味着它不会对响应的主体设置任何内容.它会在响应中映射状态代码,但正文为空.
@ControllerAdvice 用于Spring MVC应用程序中的全局错误处理.它还可以完全控制响应的主体和状态代码.
Jér*_*e B 11
A @ExceptionHandler是控制器的本地:只有来自此控制器的异常才会路由到他的控制器@ExceptionHandler
但是,一个@ControllerAdvice是全球性的:你可以处理异常一种集中的方式,绑定等它适用于所有定义的控制器.
区别在于:如果我需要配置异常处理代码,那么我需要在项目中使用@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);
}
Run Code Online (Sandbox Code Playgroud)
}
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);
}
Run Code Online (Sandbox Code Playgroud)
如果代码中同时存在两者,则本地对象优先于全局代码。理想情况下,第二种选择是更好的选择,因为我们不需要在每个控制器类中添加代码,并且@ControllerAdvice此类可以作为一站式解决方案,以解决由于从控制器到整个dao的代码而引起的所有异常代码的长度。
| 归档时间: |
|
| 查看次数: |
12475 次 |
| 最近记录: |