Spring 异常处理之 HTTP 状态码

关于spring的异常处理,官方博客已经讲的非常清楚了。另外,该博客中提到的一个例子也是写的非常好的。而本文是学习了官方博客和其中的例子之后,个人的学习总结。

需要指出的是,本文的异常处理不是针对REST类型的系统的,REST类型的系统的异常处理在会在博主的其他文章中讲解。

Spring的异常处理有3种形式,可以总结如下:

  1. 将异常对象映射为HTTP状态码(@ResponseStatus)
  2. 本地处理(@ExceptionHandler)
  3. 全局处理(@ControllerAdvice结合@ExceptionHandler)

本文讲解的是第一种。其实,spring内部就已经将一些异常信息映射为HTTP状态码,具体是哪个异常映射到哪个状态码,本身并不重要,也不是我们需要关心的,真想知道的话,spring文档中有。但是,正因为如此,spring也允许我们将一些自定义的异常映射为状态码。下面,我们通过例子,来具体介绍。

  • 首先,我们需要将@ResponseStatus这个注解应用到自定义的异常上面,将该异常映射为HTTP状态码,同时,还可以指定异常提示信息。
/**
* 在自定义的异常上添加@ResponseStatus注解,将其映射为一个HTTP状态码
*/
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "资源不存在")
public class NotFoundException extends RuntimeException {

}
  • 接着,只需要在合适的地方抛出这个异常就行了。
/**
* 异常处理之 - 使用 HTTP 状态码
*
* 此时,如果开启默认的错误页面的话 server.error.whitelabel.enabled=true
*
* ResponseStatus 注解的 reason 属性值会被打印在错误页面上
*
* 如果关闭了默认的错误页面并且自己指定了错误页面(error.html)的内容的话,
*
* 可以通过 exception 关键字,访问到错误的类型
*
* 可以通过 status 关键字,访问到状态码
*
* 可以通过 error 关键字,访问到错误原因
*
* 可以通过 timestamp 关键字,访问到错误发生的时间
*
* 可以通过 message 关键字,访问到错误消息
*
* 可以通过 path 关键字,访问到请求路径
*
* @param categoryId 类别的ID号
* @return 视图名称
*/
@RequestMapping(value = "/{categoryId}/get", method = {RequestMethod.GET})
public String get(@PathVariable("categoryId") Long categoryId) {
  TopCategory topCategory = topCategoryService.findOne(categoryId);
  if (Objects.isNull(topCategory)) {
      throw new NotFoundException();
  }
  return "index";
}
  • 最后,在错误页面上就可以访问异常信息了
    Spring 异常处理之 HTTP 状态码_第1张图片
    注意,该错误页面使用的是thymeleaf。其中的变量,如exception、timestamp、status、message、path等是在org.springframework.boot.autoconfigure.web.DefaultErrorAttributes 中定义的

  • 通过浏览器访问该接口,触发异常
    Spring 异常处理之 HTTP 状态码_第2张图片

好了,本文到这里就结束了。本文主要是讲解这种异常处理方法(将异常映射为HTTP状态码),关于哪个状态码会被映射到哪个页面,不是本文要讲的。

  • 参考
  1. Spring 异常处理之HTTP状态码
  2. Spring 异常处理之本地处理
  3. Spring 异常处理之全局处理
  4. Spring REST 异常处理之本地处理
  5. Spring REST 异常处理之全局处理

你可能感兴趣的:(Spring)