Spring源码解析 -- SpringWeb请求参数获取解析

本文深入解析SpringWeb框架中请求参数的获取过程。通过跟踪源码,了解参数从请求到方法调用的传递步骤,包括参数列表获取、解析器匹配、参数值解析和转换等关键环节。
摘要由CSDN通过智能技术生成

Spring源码解析 – SpringWeb请求参数获取解析


简介

在文章:Spring Web 请求初探中,我们看到最后方法反射调用的相关代码,本篇文章就探索其中的参数是如何从请求中获取的

概览

方法反射调用的关键代码如下:

public class InvocableHandlerMethod {
   
	protected Object doInvoke(Object... args) throws Exception {
   
		Method method = getBridgedMethod();
		ReflectionUtils.makeAccessible(method);
		try {
   
			if (KotlinDetector.isSuspendingFunction(method)) {
   
				return CoroutinesUtils.invokeSuspendingFunction(method, getBean(), args);
			}
			return method.invoke(getBean(), args);
		}
		catch (IllegalArgumentException ex) {
   
			......
		}
	}
}

现在我们更新我们的代码如下,增加接个参数:

import com.example.springexample.vo.User;
import org.springframework.web.bind.annotation.*;

@RestController
public class HelloWorld {
   

    @GetMapping("/")
    public String helloWorld(@RequestParam(value = "id") Integer id,
                             @RequestParam(value = "name") String name) {
   
        return "Hello world:" + id;
    }

    @GetMapping("/test1")
    public String helloWorld1(@RequestHeader(value = "id") Integer id) {
   
        return "Hello world:" + id;
    }

    @PostMapping("/test2")
    public String helloWorld2(@RequestBody User user) {
   
        return "Hello world:" + user.toString();
    }
}

发起下面的请求,在上面反射调用的代码中打上断点,跟踪调用栈分析:

GET http://localhost:8080/?id=1&id=2

POST http://localhost:8080/test2
Content-Type: application/json

{"name": "name", "password": "password"}

源码解析

首先查看调用栈,我们找到了参数最开始获取的相关代码,在下面的代码中获取相关的参数:

	# InvocableHandlerMethod.java
	@Nullable
	public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
			Object... providedArgs) throws Exception {
   
		// 得到了相关的参数
		Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
		if (logger.isTraceEnabled()) {
   
			logger.trace("Arguments: " + Arrays.toString(args));
		}
		return doInvoke(args);
	}

继续跟踪看看函数:getMethodArgumentValues

	# InvocableHandler
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值