Spring如何只通过形参名匹配查询参数?
How can Spring match query parameter only by formal parameter name?
假设我有以下代码片段:
@RequestMapping(method = RequestMethod.GET)
public List<Article> getArticles(@RequestParam int offset,
@RequestParam int limit) {
...
}
当参数名称未明确指定为注释参数时,Spring 如何将 HTTP 查询参数与正确的形式参数匹配?
是否假定形式参数名称始终存在于字节码中?
据我了解,并非总是如此。只有在以下情况下才能从字节码中检索形式参数名称:
a) class 文件已使用 -parameters javac 选项编译
b) class 文件已使用 -g(或 -g:vars)javac 选项进行编译,它添加了调试信息,包括真正的变量名称(因为形式参数存储为第一个本地参数方法变量)
为了找到您问题的答案,我使用 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
配置示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-g:none</compilerArgument>
</configuration>
</plugin>
</plugins>
</build>
之后,我的网络服务开始抛出错误:
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 在运行时检索参数名称。
假设我有以下代码片段:
@RequestMapping(method = RequestMethod.GET)
public List<Article> getArticles(@RequestParam int offset,
@RequestParam int limit) {
...
}
当参数名称未明确指定为注释参数时,Spring 如何将 HTTP 查询参数与正确的形式参数匹配?
是否假定形式参数名称始终存在于字节码中?
据我了解,并非总是如此。只有在以下情况下才能从字节码中检索形式参数名称:
a) class 文件已使用 -parameters javac 选项编译
b) class 文件已使用 -g(或 -g:vars)javac 选项进行编译,它添加了调试信息,包括真正的变量名称(因为形式参数存储为第一个本地参数方法变量)
为了找到您问题的答案,我使用 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
配置示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-g:none</compilerArgument>
</configuration>
</plugin>
</plugins>
</build>
之后,我的网络服务开始抛出错误:
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 在运行时检索参数名称。