Java — Порядок расширения сопоставления запросов и переменных

#java

#java

Вопрос:

Я не уверен, как @RequestMapping это работает, и не могу это проверить, но у меня есть код, и мне нужно понять, чтобы что-то устранить.

Если запрос URL /view/game1 -адреса и в строке String testString {service} , "service" переменная and уже оба расширены до /view/game1, request, game1, String.class ? Например, он расширяется во @RequestMapping время, а затем также расширяется во testString время инициализации?

Также на каком этапе происходит расширение? Тогда есть @RequestMapping testString и MyClass service = MyClass.getName(testString) .

 @RequestMapping("/view/{service}")
public ServiceResponse TESTService(HttpServletRequest request, HttpServletResponse response)
{
 String testString = bindTestVariable("/view/{service}", request, "service", String.class);
 MyClass service = MyClass.getName(testString);
 return service;
}
  

Ответ №1:

В этом коде не происходит никакого «расширения». Существует «извлечение» (или «синтаксический анализ») части пути URL, что происходит при bindTestVariable() вызове метода.

Однако вы должны позволить Spring сделать это, используя @PathVariable .

Кроме того, соглашение об именовании Java предусматривает, что имена методов должны начинаться со строчной буквы.

 @GetMapping("/view/{service}")
public ServiceResponse testService(@PathVariable("service") String service)
{
    return MyClass.getName(service);
}
  

Комментарии:

1. итак, когда вызывается bindTestVariable, первый аргумент "/view/{service}" становится "/view/game1" правильным? Я имею game1 в виду, что это из URL, а не из какого-либо кода. Это то, что я пытаюсь выяснить, потому что по какой-то причине класс возвращает пустую строку, и, возможно, это может быть какой-то другой класс, но я должен был понять это, прежде чем проверять другие вещи

2. Также как насчет второго аргумента "service" ? Извлекается ли он во время bindTestVariable()?

3.@anon Нет, "/view/{service}" не становится "/view/game1" , во всяком случае, наоборот. "/view/game1" Путь извлекается из request , затем сопоставляется с "/view/{service}" , что означает, что service = "game1" . Поскольку bindTestVariable() было сказано вернуть значение service , оно возвращается "game1" . С помощью Spring @PathVariable Spring выполнит то же сопоставление и вызовет ваш метод в "game1" качестве значения параметра.

4. Итак, третий аргумент «service» — это просто указать, что возвращать? правильно? Фактическая функция называется «bindPathVariable ()», хотя я подумал, что переименовал бы ее, предполагая, что это что-то личное, хотя, похоже, это как-то связано @PathVariable .