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";
}
  • 最后,在错误页面上就可以访问异常信息了
    error.html
    注意,该错误页面使用的是thymeleaf。其中的变量,如exception、timestamp、status、message、path等是在org.springframework.boot.autoconfigure.web.DefaultErrorAttributes 中定义的

  • 通过浏览器访问该接口,触发异常
    这里写图片描述

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

  • 参考
  1. Spring 异常处理之HTTP状态码
  2. Spring 异常处理之本地处理
  3. Spring 异常处理之全局处理
  4. Spring REST 异常处理之本地处理
  5. Spring REST 异常处理之全局处理
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值