作者:克乄浪木守 | 来源:互联网 | 2022-12-15 11:25
假设我有以下代码片段:
@RequestMapping(method = RequestMethod.GET)
public List getArticles(@RequestParam int offset,
@RequestParam int limit) {
...
}
当参数名称未明确声明为注释参数时,Spring如何将HTTP查询参数与正确的形式参数匹配?
它是否假设形式参数名称始终存在于字节码中?
据我了解,并非总是如此.只有在以下情况下才能从字节码中检索形式参数名称:
a)类文件已使用-parameters javac选项编译
b)类文件已使用-g(或-g:vars)javac选项进行编译,该选项添加包含真实变量名称的调试信息(因为形式参数存储为方法的第一个局部变量)
1> Oleksandr Py..: 为了找到问题的答案,我maven
使用以下命令构建了Spring REST应用程序:
mvn clean install -X
我build.log
包含以下调试信息:
[DEBUG] Command line options:
... -g -nowarn -target 1.8 -source 1.8 -encoding UTF-8
我们可以看到,该 -g
选项默认存在,它生成调试信息,包括局部变量.
为了证明不是这样,我maven-compiler-plugin
使用以下选项更新了配置:
-g:none
配置示例:
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.8
1.8
-g:none
之后,我的Web服务开始抛出错误:
java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not
available, and parameter name information not found in class file either.
似乎默认maven-compiler-plugin
包含-g
选项.这允许Spring在运行时检索参数名称.