0. 前言

@ResponseStatus注解是spring-web包中提供的一个注解,从下图部分源码中可以看出@ResponseStatus注解具有value、code、reason 三个属性。

@ResponseStatus注释可指定下表所示属性:

1. @ResponseStatus注解用法

@ResponseStatus注解有两种用法,一种是加载自定义异常类上,一种是加在目标方法中,当修饰一个类的时候,通常修饰的是一个异常类。

Tips: 这里我们说一下加在目标方法上的这种情况,注解中有两个参数,value属性设置异常的状态码,reaseon是对于异常的描述,其实@ResponseStatus大部分情况下更适合于在自定义异常类或者目标方法上使用。

1.1 标注在@ControllerAdvice中

controller

@GetMapping("/err")
public Response errorTest(){int i = 1 / 0;return new Response(401, "1/0", null);
}

ExceptionController

@RestControllerAdvice
public class ExceptionController {// 捕捉其他所有异常@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public Response globalException(HttpServletRequest request, Throwable ex) {return new Response(400,"1 / 0",null);}
}

由于1 / 0 出现异常被我们捕获之后返回我们自定义的状态码400,和自定义的结果。ResponseStatus就是设置了状态码400.

1.2 标注在controller方法上

使用的是@RestController返回json内容

1.2.1 修改状态码

@RequestMapping(path = "/401")
@ResponseStatus(value = HttpStatus.CREATED)
public Response unauthorized() {return new Response(401, "Unauthorized", null);
}

HttpStatus.CREATED 状态码为201,将原来请求状态码200改为201

1.2.2 使用reason

@RequestMapping(path = "/401")
@ResponseStatus(value = HttpStatus.UNAUTHORIZED,reason = "no no no")
public Response unauthorized() {return new Response(401, "Unauthorized", null);
}

如果@ResponseStatus有reason属性,@RequestMapping方法返回值都不处理了,直接返回。如下:

建议不要使用

1.3 标注在自定义的异常类上

使用时,先声明一个自定义异常类,在自定义异常类上面加上@ResponseStatus注释表示系统运行期间,当抛出自定义异常的时候,使用@ResponseStatus注解中声明的属性和reason属性将异常信息返回给客户端,提高可读性。

MyException

@ResponseStatus(code = HttpStatus.PAYMENT_REQUIRED,reason = "this is MyException")
public class MyException extends RuntimeException {public MyException() {}
}

controller

@GetMapping("/err2")
public Response errorTest2(){throw new MyException();
}

结果:

2. 底层原理

注解底层还是通过设置 response.setStatus来实现.

在@RequestMapping方法执行完成,Spring解析返回值之前,进行了responseStatus设置.

代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#setResponseStatus

this对象指当前的ServletInvocableHandlerMethod,看到 @ResponseStatus的reason不为空,就调用response.sendError ; reason为空,就调用setStatus方法仅仅设置响应状态码.

代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle

发现如果ServletInvocableHandlerMethod的responseReason有值,也就是@ResponseStatus有reason属性,@RequestMapping方法返回值都不处理了,直接返回;

也就是说只要有@ResponseStatus的 reason属性标注在 处理器Controller类或者方法上,比如响应状态码code设置为 404,reason设置为页面没找到 ,那 tomcat 展示界面是这样大概,展示信息就是我们写的reason属性.

@ResponseStatus(code=A,reason=B)标注在 @RequestMapping方法上,作用效果与 response.sendError(A,B)是一样的.

3.参考

https://www.cnblogs.com/lvbinbin2yujie/p/10575101.html

https://blog.csdn.net/Thinkingcao/article/details/110875494

@ResponseStatus注解相关推荐

  1. spring springboot springcloud常用注解

    @SpringBootApplication 组合注解,用在启动类上,源码: @Retention(RetentionPolicy.RUNTIME) @SpringBootConfiguration ...

  2. 40 个 Spring Boot 常用注解

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...

  3. 40 个 SpringBoot 常用注解

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://ramostear.com/ 一.Spring Web MVC 与 Spring Bean 注解 Spri ...

  4. 40 个 SpringBoot 常用的注解,你知道几个?

    一.Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @RequestMapping @RequestMapping注解的主要用途是将Web请求与请求 ...

  5. 帮你梳理springboot所有常用注解

    文章目录 1.springmvc注解 1. @RestController.@ResponseBody.@Controller 2. @RequestMapping.@GetMapping.@Post ...

  6. 40 个 SpringBoot 常用注解:让生产力爆表!

    作者 | 谭朝红 来源 | www.ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @RequestMapping ...

  7. 40 个 常用的 SpringBoot 注解,你知道几个?

    点击关注公众号,实用技术文章及时了解 一.Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @RequestMapping @RequestMappi ...

  8. Spring-boot 注解学习

    目录 @Compnent @Bean @CopmponentScan @Configuration @Autowired Lombok常用的注解 @Retention @ControllerAdvic ...

  9. Spring Boot-2-核心注解

    1. 核心注解 在一个标准的java应用程序的入口处(main),我们需要核心注解.@SpringBootApplication 它是一个组合注解,包含以下注解 @springBootApplicat ...

最新文章

  1. 吸水间最低动水位标高_消防水泵-吸水管路设置要求
  2. jvm调优:何为垃圾及与c++的对比
  3. Settype COM_TA_MANUFAC - mapping between ERP Equipment and CRM Individual Object
  4. 采访问题 What is your role at XX and what are your responsibilities
  5. AI落地谁最强?AI Top 30+案例评选等你来秀
  6. QRegExpValidator
  7. c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作
  8. 【Kafka】命令行管理topic
  9. zedboard linux内核下载,zedboard学习-为Linux内核打补丁
  10. 【数据结构】递归代码模板
  11. Aittit rpc的实现协议 JSON-RPC XML-RPC . Ws协议webservice 目录 1. XML-RPC协议 1 1.1. JSON-RPC远程调用协议 - CieloSun
  12. 能源消耗总量计算公式_电力消耗占比计算公式
  13. hdu1429推箱子
  14. EXCEL数组公式求解一定条件下的最大值及最小值
  15. Android端如何简单的防黑产
  16. 怎么做革命性创新产品
  17. 人工智能/机器学习/深度学习:学习路线图
  18. 预测大盘最准确的指标_杨守东:自己用多年预测大盘顶底指标公式
  19. 什么是跨境电商ERP系统
  20. js中遍历数组加到新数组_javaScript 遍历数组方法总结

热门文章

  1. 知其所以然--解说Solder Mask和Paste Mask的一些文章集锦
  2. 医学生可以跨专业考计算机的专业,写给那些本科不是医学专业,准备跨考医学专业同学的信......
  3. 基于Abaqus的随机纤维增强复合材料拉伸试样建模插件
  4. abs与fabs的区别和用法
  5. 杀死一个程序员不需要用枪
  6. 索尼相机卡照片误删丢失恢复图文教程
  7. 企业级信息系统开发讲课笔记3.4 基于Java配置类SSM框架西蒙购物网
  8. 测试接触电流的一些小常识
  9. 2年经验总结,告诉你如何做好项目管理
  10. 阿里Java编码手册实战详解-命名规范篇