gpt4 book ai didi

java - Springs @RequestParam 注解的内部工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:15:02 25 4
gpt4 key购买 nike

在 Spring 中,如果我没记错的话,以下两个语句是相同的:

@RequestParam("type") String type
@RequestParam String type

spring如何知道'type'的变量名(第二版)。我的印象是该信息已从类文件中删除,除非使用-g 标志(包括调试信息)。

最佳答案

这个的简短版本是显然正在编译参数名称,如果没有,您会得到一个异常,表明 Spring MVC 无法推断出参数名称。也就是说,参数名称并不总是存储在字节码中,但似乎如果它们是,Spring 会找到它们,如果不是,则需要在添加 @RequestParam 注释时指定它们。

有关此 similar question 的其他详细信息它是 answers .


在3.0.5.RELEASE中,这些注解在HandlerMethodInvoker.resolveHandlerArguments中处理并且似乎如果没有提供任何值,Spring 将使用 RequestParam.value()。这可以返回空字符串。

再往下,Spring 使用HandlerMethodInvoker.resolveRequestParam , 并且在那里,如果参数名称为空,它调用 HandlerMethodINvoker.getRequiredParameterNameMethodParameter methodParam 作为参数:

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 }

所以这使用了一个叫做 ParameterNameDiscoverer 的东西,但这是一个接口(interface),我的跟踪没有显示它使用的是哪个实现,有一个 few .看着LocalVariableTableParameterNameDiscoverer.getParameterNames我们最终调用了 LocalVariableTableParameterNameDiscoverer.ParameterNameDiscoveringVisitor作为 org.objectweb.asm.ClassReader 的一部分,据我所知,它试图从字节码中读取参数名称。

关于java - Springs @RequestParam 注解的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com