源码 解析_springmvc源码架构解析之@ResponseStatus

说在前面

前期回顾

sharding-jdbc源码解析 更新完毕

spring源码解析 更新完毕

spring-mvc源码解析 更新完毕

spring-tx源码解析 更新完毕

spring-boot源码解析 更新完毕

rocketmq源码解析 更新完毕

dubbbo源码解析 更新完毕

netty源码解析 更新完毕

spring源码架构更新完毕

springmvc源码架构更新中

springboot源码架构计划中

github https://github.com/tianheframe

sharding-jdbc源码解析 更新完毕

rocketmq源码解析 更新完毕

seata 源码解析 更新完毕

dubbo 源码解析 更新完毕

netty 源码解析 更新完毕

源码解析

@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ResponseStatus {

用应该返回的状态代码和原因标记方法或异常类。当处理程序方法被调用并覆盖其他方法(如ResponseEntity或“redirect:”)设置的状态信息时,状态代码应用于HTTP响应。警告:在异常类上使用此注释时,或在设置此注释的原因属性时,HttpServletResponse。将使用sendError方法。HttpServletResponse。sendError,认为响应已完成,不应再写入任何其他内容。此外,Servlet容器通常会编写一个HTML错误页面,因此使用了不适合REST api的原因。对于这种情况,最好使用org.springframe .http。ResponseEntity作为返回类型,避免使用@ResponseStatus。注意,控制器类也可以用@ResponseStatus进行注释,然后由所有@RequestMapping方法继承。

org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver 它使用@ResponseStatus注释将异常映射到HTTP状态代码。

 默认情况下,这个异常解析器在DispatcherServlet和MVC Java配置以及MVC命名空间中启用。从4.2开始,这个解析器还递归地查找在cause exception上出现的@ResponseStatus,从4.2.2开始,这个解析器支持自定义组合注释中@ResponseStatus的属性重写。

@Override  protected ModelAndView doResolveException(      HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {//    解析@ResponseStatus属性值    ResponseStatus status = AnnotatedElementUtils.findMergedAnnotation(ex.getClass(), ResponseStatus.class);    if (status != null) {      try {//        解析响应状态吗        return resolveResponseStatus(status, request, response, handler, ex);      }      catch (Exception resolveEx) {        logger.warn("ResponseStatus handling resulted in exception", resolveEx);      }    }    else if (ex.getCause() instanceof Exception) {//      递归调用解析异常      return doResolveException(request, response, handler, (Exception) ex.getCause());    }    return null;  }

解析异常,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#resolveResponseStatus 处理@ResponseStatus注释的模板方法。默认实现使用HttpServletResponse. senderror (int)或HttpServletResponse发送响应错误。sendError(int, String),如果注释有原因,然后返回一个空的ModelAndView。

protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request,      HttpServletResponse response, Object handler, Exception ex) throws Exception {    int statusCode = responseStatus.code().value();    String reason = responseStatus.reason();    if (!StringUtils.hasLength(reason)) {      response.sendError(statusCode);    }    else {      String resolvedReason = (this.messageSource != null ?          this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale()) :          reason);      response.sendError(statusCode, resolvedReason);    }    return new ModelAndView();  }

说在最后

本次解析仅代表个人观点,仅供参考。

dff1d2b7418ba6ac3ad7ea6910507966.gif

扫码进入技术微信群

4297a75552868d479d31f77743d4b876.png 6ff2351e0bd7d0d775e1fb7cf97b1e60.png 9e49ccd02e8404e9f975b8b68b324e37.png钉钉技术群

35b012c728a41676a51300595b626b9a.png

qq技术群

44233bc7b55d2befa5d01408265efc49.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值