springmvc参数解析ArgumentResolvers

springmvc会找相应的amargumentresolver来处理不同类型/不同注解的参数

Requestparamargumentresolver - 标注了@RequestParam
ServletModelAttributeMethodProcessor - 自定义类型,没有标注解
RequestResponseBodyMethodProcessor - 自定义类型,添加@RequestBody注解
在这里插入图片描述
原生获取参数
在这里插入图片描述
找出能能够转换的converter
在这里插入图片描述
获取string -> double 的转换器
在这里插入图片描述

在这里插入图片描述

最终到这里将string类型转为double类型
在这里插入图片描述

不加注解,自定义参数 ServletModelAttributeMethodProcessor
在这里插入图片描述
创建一个空person attribute = createAttribute(name, parameter, binderFactory, webRequest);

	@Override
	@Nullable
	public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {

		Assert.state(mavContainer != null, "ModelAttributeMethodProcessor requires ModelAndViewContainer");
		Assert.state(binderFactory != null, "ModelAttributeMethodProcessor requires WebDataBinderFactory");

		String name = ModelFactory.getNameForParameter(parameter);
		ModelAttribute ann = parameter.getParameterAnnotation(ModelAttribute.class);
		if (ann != null) {
			mavContainer.setBinding(name, ann.binding());
		}

		Object attribute = null;
		BindingResult bindingResult = null;

		if (mavContainer.containsAttribute(name)) {
			attribute = mavContainer.getModel().get(name);
		}
		else {
			// Create attribute instance
			try {
				attribute = createAttribute(name, parameter, binderFactory, webRequest);
			}
			catch (BindException ex) {
				if (isBindExceptionRequired(parameter)) {
					// No BindingResult parameter -> fail with BindException
					throw ex;
				}
				// Otherwise, expose null/empty value and associated BindingResult
				if (parameter.getParameterType() == Optional.class) {
					attribute = Optional.empty();
				}
				bindingResult = ex.getBindingResult();
			}
		}

		if (bindingResult == null) {
			// Bean property binding and validation;
			// skipped in case of binding failure on construction.
			WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
			if (binder.getTarget() != null) {
				if (!mavContainer.isBindingDisabled(name)) {
					bindRequestParameters(binder, webRequest);
				}
				validateIfApplicable(binder, parameter);
				if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
					throw new BindException(binder.getBindingResult());
				}
			}
			// Value type adaptation, also covering java.util.Optional
			if (!parameter.getParameterType().isInstance(attribute)) {
				attribute = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);
			}
			bindingResult = binder.getBindingResult();
		}

		// Add resolved attribute and BindingResult at the end of the model
		Map<String, Object> bindingResultModel = bindingResult.getModel();
		mavContainer.removeAttributes(bindingResultModel);
		mavContainer.addAllAttributes(bindingResultModel);

		return attribute;
	}

由 DataBinder 生成beanWarpperImpl进行参数绑定

带有@RequestBody Person person 的自定参数
RequestResponseBodyMethodProcessor - readWithMessageConverters() - HttpServletRequest - HttpMessageConverters - MappingJackson2HttpMessageConverter来处理

this.objectMapper.readValue(inputMessage.getBody(), javaType);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 提供了多种参数解析器来处理客户端请求中的参数,并将其绑定到方法参数上。以下是一些常用的参数解析器: 1. `@RequestParam`:用于将请求中的参数绑定到方法参数上。可以指定参数名、是否必需、默认值等属性。例如: ```java @RequestMapping("/example") public String example(@RequestParam("name") String name) { // 处理请求参数 return "result"; } ``` 2. `@PathVariable`:用于将 URL 中的路径变量绑定到方法参数上。例如: ```java @RequestMapping("/example/{id}") public String example(@PathVariable("id") int id) { // 处理路径变量 return "result"; } ``` 3. `@RequestBody`:用于将请求体中的数据绑定到方法参数上。常用于处理 JSON 或 XML 格式的请求数据。例如: ```java @RequestMapping("/example") public String example(@RequestBody User user) { // 处理请求体数据 return "result"; } ``` 4. `@ModelAttribute`:用于将请求参数绑定到自定义对象上,并添加到模型中,以便在视图中使用。例如: ```java @RequestMapping("/example") public String example(@ModelAttribute("user") User user) { // 处理请求参数并添加到模型 return "result"; } ``` 5. 其他参数解析器:还有一些其他的参数解析器,如 `@RequestHeader`(获取请求头信息)、`@CookieValue`(获取 Cookie 值)等,可以根据具体需求选择使用。 以上是一些常用的参数解析器,Spring MVC 还提供了更多的参数解析器和灵活的配置选项,以满足各种需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值