spring异常处理 异常必须以某种方式转换为响应。
Spring提供了多种方式将异常转化为响应
:
- Spring的一些异常会默认映射为HTTP状态码
- 自定义异常上可以添加
@ResponseStatus
注解,从而将其映射为某一个HTTP状态码 - 在controller方法上添加
@ExceptionHandler
注解,使其用来处理指定类型异常
1.内置的将以异常转换为http码就不说了,由spring自身抛出,然后产生对应的HTTP状态码响应。
2.下例子用@ResponseStatus
注解将MyException
异常映射为HTTP状态码404。
@ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "没有找到")
public class MyException extends RuntimeException {
}
3.对于添加了@ExceptionHandler
注解的处理器方法,当前controller中的其他处理器方法抛出其映射的异常的时候,将会委托该方法来处理。
针对所有控制器的通用异常处理
@ExceptionHandler
注解所标注的方法能够处理当前controller
类中所有处理器方法的异常。
有没有一种方法能够处理所有controller中处理器方法所抛出的异常呢?
答案是:有的。
创建控制器基类,所有控制器类要扩展这个类,从而继承通用的@ExceptionHandler方法?
spring 引入了一个新的解决方案:控制器通知,很显然是aop原理。
控制器通知(controlleradvice
)是任意带有@ControllerAdvice
注解的类,这个类会包含一个或多个如下类型的方法:
@ExceptionHandler
注解标注的方法;@InitBinder
注解标注的方法;@ModelAttribute
注解标注的方法
以上所述的这些方法会运用到所有controller中带有@RequestMapping
注解的方法上
@ControllerAdvice
注解本身已经使用了@Component
注解,所以它是一个spring 组件。
//@ControllerAdvice注解源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice{...
**总结:**创建控制器通知类(@ControllerAdvice
注解),在类中使用@ExceptionHandle
注解定义通用异常处理方法。