栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Springs @RequestParam批注的内部工作

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springs @RequestParam批注的内部工作

简短的说法是,参数名显然是在其中编译的,如果没有编译,则会出现异常,表明Spring
MVC无法推断出参数名。也就是说,参数名称并不总是存储在字节码中,但是看起来好像是,Spring会找到它们,如果没有,则在添加

@RequestParam
注释时需要指定它们。

有关此类似问题及其答案的其他详细信息。


在3.0.5.RELEASE中,这些注释在HandlerMethodInvoker.resolveHandlerArguments中进行处理,并且似乎没有提供任何值,Spring会使用

RequestParam.value()
。这可以返回空字符串。

再往下,Spring使用

HandlerMethodInvoker.resolveRequestParam
,在其中,如果参数名称为空,则
HandlerMethodINvoker.getRequiredParameterName
使用
MethodParametermethodParam
作为参数进行调用:

718     private String getRequiredParameterName(MethodParameter methodParam) {719     String name = methodParam.getParameterName();720     if (name == null) {721         throw new IllegalStateException(722      "No parameter name specified for argument of type [" + methodParam.getParameterType().getName() +723   "], and no parameter name information found in class file either.");724     }725     return name;726 }

请注意,这里它尝试从中提取信息

methodParam
,如果我们备份树,我们会看到
resolveHandlerArguments
实际上
MethodParameter
为它处理的每个参数创建了一个新值。在内部
MethodParameter
,我们可以看一下
getParameterName()

276 public String getParameterName() {277     if (this.parameterNameDiscoverer != null) {278         String[] parameterNames = (this.method != null ?279      this.parameterNameDiscoverer.getParameterNames(this.method) :280      this.parameterNameDiscoverer.getParameterNames(this.constructor));281         if (parameterNames != null) {282  this.parameterName = parameterNames[this.parameterIndex];283         }284         this.parameterNameDiscoverer = null;285     }286     return this.parameterName;287 }

所以这使用了一个叫做a的东西

ParameterNameDiscoverer
,但这是一个接口,我的跟踪没有显示它正在使用哪个实现,有几个。通过查看LocalVariableTableParameterNameDiscoverer.getParameterNames,我们最终将a
LocalVariableTableParameterNameDiscoverer.ParameterNameDiscoveringVisitor
作为的一部分进行了调用
org.objectweb.asm.ClassReader
,据我所知,尝试从字节码中读取参数名称。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610001.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号