springBoot请求处理及解析参数

①获取处理请求的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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值