处理异常

来源:互联网 发布:郭达 刁光斗 知乎 编辑:程序博客网 时间:2024/06/06 00:12
Spring提供了多种方式将异常转换为响应:
1、特定的Spring异常将会自动映射为指定的HTTP状态码;
2、异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码;

3、在方法上可以添加@ExceptionHandler注解,使其用来处理异常。

1、

Spring异常                                                HTTP状态码
BindException  400 - Bad Request
ConversionNotSupportedException 500 - Internal Server Error
HttpMediaTypeNotAcceptableException  406 - Not Acceptable
HttpMediaTypeNotSupportedException  415 - Unsupported Media Type
HttpMessageNotReadableException  400 - Bad Request
HttpMessageNotWritableException  500 - Internal Server Error
HttpRequestMethodNotSupportedException  405 - Method Not Allowed
MethodArgumentNotValidException 400 - Bad Request
MissingServletRequestParameterException 400 - Bad Request
MissingServletRequestPartException 400 - Bad Request
NoSuchRequestHandlingMethodException  404 - Not Found
TypeMismatchException 400 - Bad Request

尽管这些内置的映射是很有用的,但是对于应用所抛出的异常它们就无能为力了。幸好,Spring提供了一种机制,能够通过
@ResponseStatus注解将异常映射为HTTP状态码。


编写异常处理的方法



为控制器添加通知

如果控制器类的特定切面能够运用到整个应用程序的所有控制器中,那么这将会便利很多。举例来说,如果要在多个控制器中处理异常,
那@ExceptionHandler注解所标注的方法是很有用的。不过,如果多个控制器类中都会抛出某个特定的异常,那么你可能会发现要在
所有的控制器方法中重复相同的@ExceptionHandler方法。或者,为了避免重复,我们会创建一个基础的控制器类,所有控制器类
要扩展这个类,从而继承通用的@ExceptionHandler方法。

Spring 3.2为这类问题引入了一个新的解决方案:控制器通知。控制器通知(controller advice)是任意带有@ControllerAdvice注解的
类,这个类会包含一个或多个如下类型的方法:


@ExceptionHandler注解标注的方法;
@InitBinder注解标注的方法;
@ModelAttribute注解标注的方法。


在带有@ControllerAdvice注解的类中,以上所述的这些方法会运用到整个应用程序所有控制器中带有@RequestMapping注解的方法上


@ControllerAdvice最为实用的一个场景就是将所有的@ExceptionHandler方法收集到一个类中,这样所有控制器的异
常就能在一个地方进行一致的处理。例如,我们想将DuplicateSpittleException的处理方法用到整个应用程序的
所有控制器上。如下的程序清单展现的AppWideExceptionHandler就能完成这一任务,这是一个带有@ControllerAdvice注解的类。