SpringMVC源码解析之ServletInvocableHandlerMethod

简介: SpringMVC源码解析之ServletInvocableHandlerMethod

InvocableHandlerMethod

提供了一种方法,用于调用处理器方法,处理给定的请求,其已通过注册的HandlerMethodArgumentResolver解析了方法参数值。

参数解析往往需要WebDataBinder用于数据结合或进行类型转换。使用setDataBinderFactory(WebDataBinderFactory)属性来提供一种粘合剂厂传递给参数解析器。

使用setHandlerMethodArgumentResolvers自定义的参数解析器的列表。

invokeForRequest

解析给定请求的上下文中其参数值后调用指定方法。

参数值是通过HandlerMethodArgumentResolver解析的。

image.png

doInvoke

调用与给定的参数值的处理方法

  protected Object doInvoke(Object... args) throws Exception {
    ReflectionUtils.makeAccessible(getBridgedMethod());
    try {
      return getBridgedMethod().invoke(getBean(), args);
    }
    catch (IllegalArgumentException ex) {
      assertTargetBean(getBridgedMethod(), getBean(), args);
      String text = (ex.getMessage() != null ? ex.getMessage() : "Illegal argument");
      throw new IllegalStateException(getInvocationErrorMessage(text, args), ex);
    }
    catch (InvocationTargetException ex) {
      // Unwrap for HandlerExceptionResolvers ...
      Throwable targetException = ex.getTargetException();
      if (targetException instanceof RuntimeException) {
        throw (RuntimeException) targetException;
      }
      else if (targetException instanceof Error) {
        throw (Error) targetException;
      }
      else if (targetException instanceof Exception) {
        throw (Exception) targetException;
      }
      else {
        String text = getInvocationErrorMessage("Failed to invoke handler method", args);
        throw new IllegalStateException(text, targetException);
      }
    }
  }

ServletInvocableHandlerMethod

image.png

扩展InvocableHandlerMethod通过注册的能力来处理返回值HandlerMethodReturnValueHandler并且还支持设置基于方法级响应状态@ResponseStatus注解。

甲null返回值(包括空隙)可以被解释为请求处理结束结合有@ResponseStatus注释,未改性的检查条件(见ServletWebRequest.checkNotModified(long) ),或提供对所述接入的方法的参数响应流

invokeAndHandle

调用该方法,并通过所配置的HandlerMethodReturnValueHandler处理返回值

  • WebRequest - 当前请求
  • mavContainer - 在ModelAndViewContainer此请求
  • providedArgs - “给”论据类型匹配(未解析)
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
    Object... providedArgs) throws Exception {
  Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
  setResponseStatus(webRequest);
  if (returnValue == null) {
    if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
      mavContainer.setRequestHandled(true);
      return;
    }
  }
  else if (StringUtils.hasText(getResponseStatusReason())) {
    mavContainer.setRequestHandled(true);
    return;
  }
  mavContainer.setRequestHandled(false);
  try {
    this.returnValueHandlers.handleReturnValue(
        returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
  }
  catch (Exception ex) {
    if (logger.isTraceEnabled()) {
      logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
    }
    throw ex;
  }
}
目录
相关文章
|
7天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
16 0
|
7天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
9 0
|
7天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
16 0
|
7天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
31 0
|
7天前
yolo-world 源码解析(二)(2)
yolo-world 源码解析(二)
20 0
|
21天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
51 1
|
25天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
36 0
|
7天前
Marker 源码解析(二)(3)
Marker 源码解析(二)
13 0
|
7天前
Marker 源码解析(一)(4)
Marker 源码解析(一)
11 0

推荐镜像

更多