У меня есть два Rest URI:
// URI n1 : GET /users/{userName}
public ResponseEntity<userDto> findUserByName(
@PathVariable( value = "userName", required = true)
String userName
);
// URI n2 : GET /users/{userID}
public ResponseEntity<userDto> findUserByID(
@PathVariable( value = "userID", required = true)
Long userID
);
Когда я вызываю GET /users/SuperUser123, я хочу, чтобы реагировала первая функция, а когда я вызываю GET /users/1854, я хочу, чтобы ответила вторая. Что действительно происходит, так это то, что первая функция всегда вызывается в обоих случаях (поскольку параметр всегда имеет тип String).
Итак, как я могу достичь желаемого, соблюдая рекомендации REST API URI?





Это приведет к неоднозначному исключению времени выполнения сопоставления, поскольку шаблон URL-адреса одинаков для обоих методов.
Если ваш URL-адрес имеет какой-то шаблон, например запуск для суперпользователя или что-то в этом роде, вы можете использовать шаблоны регулярных выражений, чтобы он работал.
В приведенном ниже примере первый метод метода будет вызван, если переменная пути является цифрой, в противном случае второй метод для алфавитов. Вы можете соответствующим образом изменить шаблон регулярного выражения.
@RequestMapping("{id:[0-9]+}")
public String handleRequest(@PathVariable("id") String userId, Model model){
model.addAttribute("msg", "profile id: "+userId);
return "my-page";
}
@RequestMapping("{name:[a-zA-Z]+}")
public String handleRequest2 (@PathVariable("name") String deptName, Model model) {
model.addAttribute("msg", "dept name : " + deptName);
return "my-page";
}