Как Spring может сопоставить параметр запроса только по формальному имени параметра?
Предположим, у меня есть следующий фрагмент кода:
@RequestMapping(method = RequestMethod.GET)
public List<Article> getArticles(@RequestParam int offset,
@RequestParam int limit) {
...
}
Как Spring может сопоставить параметры HTTP-запроса с правильными формальными параметрами, если имя параметра не указано явно как параметр аннотации?
Предполагается ли, что имена формальных параметров всегда присутствуют в байт-коде?
Как я понимаю, так не всегда должно быть. Имена формальных параметров могут быть получены из байт-кода только тогда, когда:
a) файл класса был скомпилирован с опцией -parameters javac
b) файл класса был скомпилирован с опцией javac -g (или -g: vars), которая добавляет отладочную информацию, включая истинные имена переменных (поскольку формальные параметры хранятся как первые локальные переменные метода)
1 ответ
Чтобы найти ответ на ваш вопрос, я создал приложение Spring REST с maven
и с помощью следующей команды:
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 получать имена параметров во время выполнения.