随笔
处理异常
Spring 提供了多种方式将异常转换为响应:
- 特定的 Spring 异常将会自动映射为指定的HTTP状态码。
- 异常上添加 @ResponseStatus 注解,从而将其映射为某一个HTTP状态码。
- 在方法上可以添加 @ExceptionHandler 注解,使其用来处理异常。
Spring 提供的一些异常:
Spring异常 | HTTP状态码 |
---|---|
BindException | 400 |
ConversionNotSupportedException | 500 |
HttpMediaTypeNotAcceptableException | 406 |
HttpMediaTypeNotSupportedException | 415 |
HttpMessageNotReadableException | 400 |
HttpMessageNotWritableException | 500 |
HttpRequestMethodNotSupportedException | 405 |
MethodArgumentNotValidException | 400 |
MissingServletRequestParameterException | 400 |
MissingServletRequestPartException | 400 |
NoSuchRequestHandlingMethodException | 404 |
TypeMismatchException | 400 |
这是 Spring 一些自身的异常,由Spring自身抛出。
自定义异常 并抛出
自定义异常类:
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "not found")
public class NotFoundException extends RuntimeException {
}
@ResponseStatus
注解 将异常类 映射为 特定的 状态码:value
属性 指定 状态码的值。reason
属性 指定 异常的原因 ,说明。
控制类中 抛出 自定义的异常:
@RequestMapping("/show")
public void show(User user){
if (user == null){
// 抛出 自定义 的异常
throw new NotFoundException();
}
System.out.println(user.getName());
}
如果 user 为 空 ,就抛出 自定义的异常。
按照处理请求的方式 处理异常
在处理请求的方法中直接处理异常
@RequestMapping("/show/{id}")
public String show(@PathVariable("id") String id){
try{
// 会 此方法 会抛出 NotFoundException 异常
Repository.findAllUser(id);
return "user";
}catch (NotFoundException e){
return "error";
}
}
对上面的处理方式进行 优化:
@RequestMapping("/show/{id}")
public String show(@PathVariable("id") String id) {
// 会 此方法 会抛出 NotFoundException 异常
Repository.findAllUser(id);
return "user";
}
// 处理 Not Found Exception 异常
@ExceptionHandler(NotFoundException.class)
public String notFoundException(){
return "error";
}
将 处理方法 和 异常处理方法 进行了分离。
- @ExceptionHandler 注解,当控制器中的所有处理方法,只要有抛出异常的 ,它就能够处理。
- 如:
@ExceptionHandler(NotFoundException.class)
只要 有方法 抛出 Not Found Exception异常,他就能够处理。
- 如:
通过控制器通知,定义全局异常处理
控制器通知,是任意带有 @ControllerAdvice 注解的类
@ControllerAdvice
public class AppWideExceptionHandler {
// 所有 控制器的 NotFoundException 异常都会得到处理
@ExceptionHandler(NotFoundException.class)
public String exceptionHandler(){
return "error";
}
}
- @ControllerAdvice 注解修饰的类,可以包含一个或多个如下类型的方法:
@ExceptionHandler
注解标注的方法。@InitBinder
注解标注的方法。@ModelAttribute
注解标注的方法。
- 这些方法会 运用到整个应用程序所有控制器中 带有
@RequestMapping
注解的方法上。 @ControllerAdvice
注解本身使用了@Component
注解,所以 标注的类 会自动被组件扫描获取。- 如上代码,所有控制器的异常就能在一个地方进行一致的处理。