作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
数据转换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
吧,至少有默认构造函数,可以实例化出来。
好了,参数值获取和创建先说到这里,如果请求参数中没有对应参数的话,就会创建一个对象,等待后面的数据绑定,下篇说数据绑定。