Весенняя загрузка — сопоставление

#spring #spring-boot #spring-mvc

#весна #весенняя загрузка #spring-mvc

Вопрос:

В приведенном ниже коде есть два метода, аннотированных @GetMapping аннотацией, один ожидает пустой путь, другой ожидает переменную path .

 @Controller
@RequestMapping("/")
public class BasicController {

  @GetMapping()
  public String get(Model model) {
    // doing something
  }

  @GetMapping("/{variable}")
  public String getWithPathVar(@PathVariable("variable") String variable, Model model) {
    // doing something different
  }
}
  

Проблема: когда приложение запущено, и я нажимаю «www.myurl.com /» он вводит оба метода, даже если нет параметра path. Как я могу это исправить?

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

1. Пытались ли вы удалить @RequestMapping(«/») из контроллера, а затем поместить @GetMapping(«/») в первый метод get и @GetMapping(«/{variable}») во второй метод getWithPathVar()

2. Я перепробовал много разных комбинаций, но, видимо, не эту 🙂 Это помогло. Спасибо!

Ответ №1:

Если это так, это звучит как ошибка или какая-то неправильная настройка с фильтрами. Я не могу воспроизвести это поведение на Spring 5.2.7 . Вот статья, в которой объясняется, как Spring работает под капотом.

Если вы не можете обновить версию Spring, вы можете использовать только одну конечную точку в качестве обходного пути.

 @GetMapping("/{variable}")
public String getWithPathVar(@PathVariable("variable") String variable, Model model) {
  // doing something different
 if(variable != null) {
   // fulfill the normal workflow
 } else {
   // call ex get() workflow
  }
}
  

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

1. Я использую Spring v5.2.8 с конфигурацией по умолчанию: (Комментарий, который добавил @implosivesilence, помог…

2. Как я уже упоминал выше, я не могу воспроизвести его даже для 5.2.8 . Кстати, что вы возвращаете в этих двух методах? Еще одна важная вещь: вы используете @Controller с конечными точками без @ResponseBody вместо @RestController . В этом случае возвращаемое значение должно интерпретироваться Spring как имя представления