Как Spring может сопоставить параметр запроса только по формальному имени параметра? - PullRequest
0 голосов
/ 03 июня 2018

Предположим, у меня есть следующий фрагмент кода:

@RequestMapping(method = RequestMethod.GET)
public List<Article> getArticles(@RequestParam int offset,
                                 @RequestParam int limit) {
  ...
}

Как Spring может сопоставить параметры HTTP-запроса с правильными формальными параметрами, если имя параметра явно не указано в качестве параметра аннотации?

Предполагается ли, что формальные имена параметров всегда присутствуют в байт-коде?

Как я понимаю, это не всегда должно быть так.Имена формальных параметров могут быть получены из байт-кода только в том случае, если:

a) файл класса был скомпилирован с параметром -parameters javac

b) файл класса был скомпилирован с помощью -g (или-g: vars) опция javac, которая добавляет отладочную информацию, включая истинные имена переменных (поскольку формальные параметры хранятся как первые локальные переменные метода)

1 Ответ

0 голосов
/ 04 июня 2018

Чтобы найти ответ на ваш вопрос, я создал приложение Spring REST с maven и с помощью следующей команды:

mvn clean install -X

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

...