SpringMVC异步处理:一般分两种处理方法 第一种是:局部异常处理,第二种是:全局异常处理
一、局部异常处理
在Controller层里面使用@ExceptionHandler注解:这种方式处理的异常只针对@ExceptionHandler所在的那个Controller方法,局限性比较大。对于Controller之外出现的异常无法处理。
在配置当前Controller的异常处理【-@ExceptionHandler[(可以指定处理的指定异常类.class)]】,对于文件上传的异常,默认这里是无法处理的 出现异常的地方不在本Controller内可以在multipartResolver 中配置后捕获
二、全局异常处理
(1)、使用SimpleMappingExceptionResolver该方法处理全局异常,只要有对应的异常抛出,就会使用这个bean进行处理。使用SimpleMappingExceptionResolver 的话,只要在springmvc配置文件中添加配置就可以了。
(2)、使用HandlerExceptionResolver这个是全局异常,只要有对应的异常抛出,就会使用这个类进行处理。注意使用这种方式的话,需要使这个类成为bean,可以使用注解方式,也可以在spring配置文件中声明。HandlerExceptionResolver 的实现类会 catch 到 @Controller 方法执行时发生的异常,处理后返回ModelAndView 作为结果视图,因此可以通过它来定制异常视图。
HandlerExceptionResolver 只能捕获 @Controller 层发生的异常(包括 @Controller 调用@Service
发生的异常)。而其他地方的异常,比如访问了一个不存在的路径,不会HandlerExceptionResolver 捕获。
(3)、使用 @ControllerAdvice 和 @ExceptionHandler 注解
使用@ControllerAdvice和@ExceptionHandler注解这是全局的异常,@Controller是一部分的异常但是@ControllerAdvice是全局的可以配置,它也不是完全是全局,根据配置来决定。
还有一个注解 @RestControllerAdvice 等价于 @ControllerAdvice + @ResponseBody
注意:!!本质:这种方式配置的异常处理由HandlerExceptionResolver的默认实现类HandlerExceptionResolverCompsite 处理,但是它也有一个限制也是只能捕获 @Controller 层的异常。虽然它是全局的,但是它是@Controller的全局
@ControllerAdvice 指定 Controller 范围主要依靠自身的几个属性实现:
- basePackages :指定一个或多个包,这些包及其子包下的所有 Controller 都被该
@ControllerAdvice 管理。下面三种写法等价:
@ControllerAdvice(“com.gx.controller”)
@ControllerAdvice(value = “com.gx.controller”)
@ControllerAdvice(basePackages = “com.gx.controller”)
还可以用数组形式:@ControllerAdvice(basePackages={“字符串”,“字符串”}) - basePackageClasses :是 basePackages 的一种变形,指定一个或多个 Controller 类,这些类
所属的包及其子包下的所有 Controller 都被该 @ControllerAdvice 管理。
@ControllerAdvice(basePackageClasses = FileUploadController.class) - assignableTypes :指定一个或多个 Controller 类,这些类被该 @ControllerAdvice 管理。
@ControllerAdvice(assignableTypes = {FileUploadController.class})
4.annotations:指定一个或多个注解,被这些注解所标记的Controller会被该@ControllerAdvice管理。@ControllerAdvice(annotations = {RestController.class})