Как 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 получать имена параметров во время выполнения.

Другие вопросы по тегам