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


247

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

Подобно :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}

Ответы:


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"})

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){
...
}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.