
简短的说法是,参数名显然是在其中编译的,如果没有编译,则会出现异常,表明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,据我所知,尝试从字节码中读取参数名称。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)