①获取处理请求的handler,执行处理handler:
ha.handle(processedRequest, response, mappedHandler.getHandler());
②执行handler:
handleInternal(request, response, (HandlerMethod) handler);
③调用requestMapping处理方法:
invokeHandlerMethod(request, response, handlerMethod);
④执行并处理:
invocableMethod.invokeAndHandle(webRequest, mavContainer);
⑤通过参数解析器解析参数并执行请求:
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
⑥获取请求参数:
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
⑦处理请求参数:
protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
//获取请求参数
MethodParameter[] parameters = getMethodParameters();
if (ObjectUtils.isEmpty(parameters)) {
return EMPTY_ARGS;
}
Object[] args = new Object[parameters.length];
//通过循环一个一个处理参数
for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
args[i] = findProvidedArgument(parameter, providedArgs);
if (args[i] != null) {
continue;
}
if (!this.resolvers.supportsParameter(parameter)) {
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
}
try {
从容器中找到匹配的参数处理器
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
}
catch (Exception ex) {
// Leave stack trace for later, exception may actually be resolved and handled...
if (logger.isDebugEnabled()) {
String exMsg = ex.getMessage();
if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {
logger.debug(formatArgumentError(parameter, exMsg));
}
}
throw ex;
}
}
return args;
}
⑧循环判断参数处理器是否支持处理当前参数:
private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
if (result == null) {
//循环所有的参数处理器
for (HandlerMethodArgumentResolver resolver : this.argumentResolvers) {
//判断当前参数解析器是否支持解析当前参数
if (resolver.supportsParameter(parameter)) {
result = resolver;
//将参数解析器放入缓存
this.argumentResolverCache.put(parameter, result);
break;
}
}
}
//返回匹配的参数解析器
return result;
}
⑨执行解析参数:
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;