springmvc参数解析ArgumentResolvers

本文探讨SpringMVC中RequestParam和RequestBody的参数处理,包括ArgumentResolver的工作原理、自定义ModelAttribute的创建与转换,以及MappingJackson2HttpMessageConverter在处理自定义类型上的角色。
摘要由CSDN通过智能技术生成

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值