Как использовать несколько аннотаций @RequestMapping весной?

247

Можно ли использовать несколько @RequestMappingаннотаций над методом?

Подобно :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}
wuntee
источник

Ответы:

436

@RequestMappingимеет String[]параметр value, поэтому вы должны иметь возможность указать несколько значений, например:

@RequestMapping(value={"", "/", "welcome"})

Эд Браннин
источник
2
Тем не менее, у меня возникли проблемы с получением значений "" или "/", которые фактически работают в моем приложении. Они работают на тебя?
Эд Браннин
Есть ли способ связать различные виды успеха и формы с каждым URL-адресом запроса, используя несколько аннотаций?
K-Den
@EdBrannin Мне нужно много, чтобы использовать, пользовательский, заголовок,
потребление
Также я хотел бы знать, как узнать, какая карта запросов была вызвана. это / или приветствуется?
Сиддхарт
1
@Siddharth 1. Возможно, вы сможете добавить и проверить параметр типа HttpRequest. 2. Если вам действительно важно, какое отображение было названо, возможно, не используйте эту технику. ;)
Эд Браннин
24

Из моего теста (весна 3.0.5) @RequestMapping(value={"", "/"}) - только "/"работает, ""нет. Тем не менее я узнал, что это работает: @RequestMapping(value={"/", " * "}), на " * "что - нибудь матчи, так что это будет по умолчанию обработчик в случае каких - либо других.

Алан Чжун
источник
13

Не нужно Аннотация RequestMapping поддерживает шаблоны и пути в стиле муравьев. Также похоже, что вы просто хотите, чтобы представление по умолчанию, так что вы можете поставить

<mvc:view-controller path="/" view-name="welcome"/>

в вашем конфигурационном файле. Это перенаправит все запросы в Root на окно приветствия.

Робби Понд
источник
Должно ли быть что-то между этими двумя линиями? Я использую FreeMarkerViewResolver - так что мне придется пойти по этому пути ... Ну, я думаю, я мог бы просто создать несколько ViewResolver.
2010 года
2
Он не обеспечивает гибкость, которую могли бы обеспечить несколько аннотаций RequestMapping. Например, если я хочу, чтобы один метод поддерживал либо значение "/ a" с помощью POST, либо значение "/ b" с помощью GET. Конечно, обходной путь довольно прост (рефакторинг функциональности в третьем методе), но просто скажу, что это было бы полезно.
Симон
1

Самый короткий путь: @RequestMapping({"", "/", "welcome"})

Хотя вы также можете сделать:

  • @RequestMapping(value={"", "/", "welcome"})
  • @RequestMapping(path={"", "/", "welcome"})
Marco
источник
1

Прямо сейчас с использованием Spring-Boot 2.0.4 - {} не будет работать.

@RequestMapping

все еще имеет String [] в качестве параметра значения, поэтому объявление выглядит так:

 @RequestMapping(value=["/","/index","/login","/home"], method = RequestMethod.GET)

** Обновление - работает с Spring-Boot 2.2 **

 @RequestMapping(value={"/","/index","/login","/home"}, method = RequestMethod.GET)
сокол
источник
Квадратные скобки недействительны. Допустимый синтаксис для литерала массива - использовать фигурные скобки {}
luis.espinal
@ luis.espinal Квадратные скобки работали с версией 2.0.4 Spring-Boot. Я буду обновлять свой пост.
Сокол
0

Также допустимо следующее:

@GetMapping(path = { "/{pathVariable1}/{pathVariable1}/somePath", 
                     "/fixedPath/{some-name}/{some-id}/fixed" }, 
            produces = "application/json")

То же самое может быть применено к @RequestMappingа

Притам Банерджи
источник
-2

Лучше использовать аннотацию PathVariable, если вы все еще хотите получить вызываемый URI.

@PostMapping("/pub/{action:a|b|c}")
public JSONObject handlexxx(@PathVariable String action, @RequestBody String reqStr){
...
}

или разобрать его из объекта запроса.

CQLI
источник