说在前面
前期回顾
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(); }
说在最后
本次解析仅代表个人观点,仅供参考。
扫码进入技术微信群
钉钉技术群qq技术群