Springs @RequestParam批注的内部工作

Springs @RequestParam批注的内部工作,第1张

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
,据我所知,尝试从字节码中读取参数名称。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5616134.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存