38、SpringBoot2.x源码分析:SpringMVC源码细节之深入模型方法三

Spring Boot 2.2.6 源码之旅三十八SpringMVC源码细节之深入模型方法三

  • 数据转换convertIfNecessary
  • 请求参数不存在的情况createAttribute

数据转换convertIfNecessary

一路调用内部最后到这里:
*
*
*
最后抛异常了:
*
这里明显会转换错误,我故意的,如果是数字的话肯定是没问题的。
这下次我改改:
*
有了:
*

请求参数不存在的情况createAttribute

前面分析的都是请求参数存在了,如果不存在呢,其实就是用构造方法创建一个对象。

	protected Object createAttribute(String attributeName, MethodParameter parameter,
			WebDataBinderFactory binderFactory, NativeWebRequest webRequest) throws Exception {
   
     

		MethodParameter nestedParameter = parameter.nestedIfOptional();
		Class<?> clazz = nestedParameter.getNestedParameterType();

		Constructor<?> ctor = BeanUtils.findPrimaryConstructor(clazz);
		if (ctor == null) {
   
     
			Constructor<?>[] ctors = clazz.getConstructors();
			if (ctors.length == 1) {
   
     
				ctor = ctors[0];
			}
			else {
   
     
				try {
   
     
					ctor = clazz.getDeclaredConstructor();
				}
				catch (NoSuchMethodException ex) {
   
     
					throw new IllegalStateException("No primary or default constructor found for " + clazz, ex);
				}
			}
		}

		Object attribute = constructAttribute(ctor, attributeName, parameter, binderFactory, webRequest);
		if (parameter != nestedParameter) {
   
     
			attribute = Optional.of(attribute);
		}
		return attribute;
	}

我们尝试让请求参数不存在,这次没有name1了:
*
但是有异常了,因为我们需要int类型,这个基本类型,没有默认构造方法,那我们改成Integer看看:
*
改成Integer
*
也一样:
*
因为他们都要找默认构造函数,是不存在的。所以要么有这个请求参数,要么改成其他类型,比如String比较好。比如我改成Dog吧,至少有默认构造函数,可以实例化出来。
*
*

好了,参数值获取和创建先说到这里,如果请求参数中没有对应参数的话,就会创建一个对象,等待后面的数据绑定,下篇说数据绑定。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。