Может ли метод в Spring MVC быть сопоставлен с несколькими URL-путями?

«Может ли метод в Spring MVC быть сопоставлен с несколькими URL-путями?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может. Для этого в аннотации маппинга (@RequestMapping, @GetMapping, @PostMapping и др.) нужно указать массив путей в атрибутах value или path.

Пример с @RequestMapping:

@RestController
@RequestMapping("/api")
public class UserController {

    // Метод будет обрабатывать GET запросы на два разных URL
    @RequestMapping(
        value = {"/users", "/members"}, 
        method = RequestMethod.GET
    )
    public ResponseEntity<List<User>> getAll() {
        // Возвращает список пользователей для обоих эндпоинтов
        return ResponseEntity.ok(userService.findAll());
    }
}

Пример с @GetMapping (более современный и лаконичный вариант):

@RestController
public class ProductController {

    // Массив путей в аннотации @GetMapping
    @GetMapping({"/items", "/products", "/catalog"})
    public List<Product> getProducts() {
        return productRepository.findAll();
    }
}

Как это работает:

  • Spring MVC регистрирует один метод-обработчик для всех указанных в массиве URL-шаблонов.
  • Это удобно для поддержки устаревших (legacy) путей или предоставления синонимов для одного ресурса.
  • Аннотации класса (@RequestMapping на уровне класса) и метода объединяются.