Springs @RequestParam 注解的内部工作原理

2023-11-23

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

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

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


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

其他详细信息可参见此类似的问题这是answers.


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

再往下,Spring 使用HandlerMethodInvoker.resolveRequestParam,在里面,如果参数名称为空,它会调用HandlerMethodINvoker.getRequiredParameterName with MethodParameter 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,但这是一个接口,我的跟踪没有显示它正在使用哪个实现,有一个few。看着LocalVariableTableParameterNameDiscoverer.getParameterNames我们最终调用了LocalVariableTableParameterNameDiscoverer.ParameterNameDiscoveringVisitor作为一个org.objectweb.asm.ClassReader,据我所知,它尝试从字节码中读取参数名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springs @RequestParam 注解的内部工作原理 的相关文章

随机推荐

  • 是否存在遵循本福德定律的随机数分布?

    Python 有多种方法来生成不同分布的随机数 请参阅的文档random module 不幸的是 如果没有适当的数学背景 特别是考虑到所需的参数 它们就不太容易理解 我想知道这些方法是否能够产生服从分布的随机数本福德定律 以及什么参数值是合
  • 在 iPad 上使位于文本框上的图像可点击(为 iOS 创建 HTML5 搜索输入类型)

    我正在尝试模拟 HTML5input type search 使用 JavaScript 我的目标是做这样的事情 首先 我将说明为什么我不直接使用 HTML5 搜索输入类型 对于 iPad 上述输入类型显示圆角文本框 本机搜索输入框所需的所
  • 将绘图保存为封装后记 (.eps) 时,R 丢失信息

    Lyx 和 Latex 可以很好地处理 eps 图像 但是 当我从 Rstudio 导出带有平滑曲线的散点图时 点会丢失 而绘图仅包含曲线 我尝试过的两种保存方法是 在 Rstudio 中 从图像字段的下拉菜单中选择 导出 并另存为 eps
  • 如何在 bash 中转义反引号

    我很长时间以来都在试图逃避 bash 中的反引号 我尝试使用 进行转义 但它不起作用 bash 中是否可以逃避反引号 示例代码 I hello pdf var1 cat lt
  • 在 F# 中实现队列类型

    我正在尝试在 F 中实现一个队列 到目前为止 这就是我所拥有的 但我认为它的行为更像是一个堆栈 type a queue NL Que of a a queue let enque m function NL gt Que m NL Que
  • appsettings.json 中 IncludeScopes 的 JSON 验证失败

    我正在使用 ASP NET Core 2 1 为什么我得到Expression must be of type object for IncludeScopes in my appsettings json file 下面是显示警告所需的
  • window.orientation 在 iOS 和 Android 中返回不同的值

    我正在测试我的网络应用程序iPad Safari 浏览器 and 三星 Tab 2 默认浏览器 The window orientationchange在两个设备中返回不同的值 document ready function window
  • 在“docker exec”命令中执行“bash -c”

    Context 我正在尝试为我的日常使用编写一个快捷方式docker exec命令 由于某些原因 我正在尝试这样的问题 当我在容器内使用 bash 控制台时 我的输出有时会被破坏 历史记录混乱 行在我编写时相互覆盖 I read here您
  • 什么时候不应该关闭 php 文件?

    我遇到过一个教程 如果我可以添加的话 这是一个有信誉的教程 其中关闭 php 标签 gt 被省略了 这让我想起了之前的一个教程 作者说它实际上更好not关闭标签 但没有解释原因 我有点惊讶 我认为关闭标签是更好的做法 为什么最好不要关闭它
  • 如何访问类中的全局环境对象?

    我有一个类需要更新全局环境对象 我可以整天在结构之间传递该环境对象 但是如何允许类对象访问同一变量 import SwiftUI class Global ObservableObject Published var num 10 clas
  • AWS Athena (Presto)如何将映射转置为列

    AWS Athena 查询问题 我的行中有一个嵌套映射 我想将其中的键转置到列 我可以明确地命名这些列 例如items label a 但在这种情况下 键实际上是动态的 从这些行 id 1 items label a foo label b
  • 需要贵金属 API/Web 服务 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有免费的网络服务 AP
  • JavaMail 按 ReceivedDate 搜索,不能精确到秒吗?

    在 IMAP 中 邮件编号基于邮件放入文件夹的时间 即文件夹中的第一封邮件为 1 第二封邮件为 2 等等 但是 此排序不考虑消息的接收日期 我担心的是早于文件夹中的消息号 1 的消息 即由用户手动移入文件夹的消息 而不是在系统接收到消息时
  • Matplotlib,添加多行文本。添加可以跟随曲线的文本

    我已将文本添加到绘图中 在每行中进行编码 然后调整它看起来不错 增加或减少宽度 或更改位置 但是 有没有办法让 Python 知道您想要文本的位置以及如何设置它 然后我可以添加文本 Python 将计算出详细信息 例如 看看下面的图片 在图
  • 在 Android 中的按钮上写入多行文本

    我想知道如何在按钮上编写多行文本
  • 如何在 Laravel 5.4.18 中使用特征?

    我需要一个示例来说明在何处准确创建文件 写入文件以及如何使用特征中声明的函数 我使用 Laravel 框架 5 4 18 我没有更改框架中的任何文件夹 所有内容都在其对应的位置 已经非常感谢了 我在我的目录中创建了一个 Traits 目录H
  • Promises,如何将变量传递到 .then 函数

    您好 这是一个帮助我理解 Promise 的问题 then返回工作 问题是 如何将变量的作用域限定为第二个 then 链函数 这是一个jsbinhttp jsbin com xacuna edit js 输出 我可以访问全局变量 并将作用域
  • 在特定时间设置 Android 闹钟

    我在特定时间设置了闹钟 但每次我打开应用程序时它都会打开 这是我使用的代码 AlarmManager alarmManager AlarmManager getSystemService Context ALARM SERVICE Inte
  • 文章中的交叉引用

    该书册为方程 图形 表格和章节提供了很好的交叉引用选项 https bookdown org yihui bookdown cross references html 但是 当我设置为输出 articles elsevier article
  • Springs @RequestParam 注解的内部工作原理

    在 Spring 中 如果我没记错的话 以下两个语句是相同的 RequestParam type String type RequestParam String type spring如何知道 type 的变量名 第二版 我当时的印象是 该