← Назад к вопросам

Может ли у метода с @RequestMapping быть несколько URL?

1.3 Junior🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Может ли у метода с @RequestMapping быть несколько URL?

Краткий ответ

Да, метод с аннотацией @RequestMapping может обрабатывать несколько URL адресов одновременно. Это достигается путём передачи массива путей в параметр value или path.

Как задать несколько URL

Наиболее распространённый способ — использовать массив строк:

@RequestMapping(value = {"/users", "/all-users", "/api/users"}, method = RequestMethod.GET)
public ResponseEntity<?> getAllUsers() {
    List<User> users = userService.findAll();
    return ResponseEntity.ok(users);
}

Оба этих URL будут маршрутизированы на один и тот же обработчик:

  • GET /users
  • GET /all-users
  • GET /api/users

Альтернативные подходы

Современный синтаксис с @GetMapping, @PostMapping и другими:

@GetMapping({"/users", "/all-users"})
public ResponseEntity<List<User>> getAll() {
    return ResponseEntity.ok(userService.findAll());
}

Это более читаемо и явно указывает HTTP метод (GET, POST, PUT, DELETE).

С параметрами в URL:

@GetMapping({"/users/{id}", "/user/{id}", "/api/users/{id}"})
public ResponseEntity<User> getUserById(@PathVariable Long id) {
    return ResponseEntity.ok(userService.findById(id));
}

Переменная {id} будет корректно парситься для всех трёх путей.

Практический пример: API с несколькими точками входа

@RestController
@RequestMapping("/app")
public class UserController {
    
    private final UserService userService;
    
    @GetMapping({"", "/users", "/list"})
    public ResponseEntity<List<User>> listUsers() {
        return ResponseEntity.ok(userService.findAll());
    }
    
    @PostMapping({"/users", "/create"})
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User saved = userService.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(saved);
    }
    
    @DeleteMapping({"/users/{id}", "/delete/{id}"})
    public ResponseEntity<?> deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
        return ResponseEntity.noContent().build();
    }
}

Этот контроллер доступен по путям:

  • GET /app или GET /app/users или GET /app/list
  • POST /app/users или POST /app/create
  • DELETE /app/users/5 или DELETE /app/delete/5

Кейсы использования

1. Обратная совместимость API:

@GetMapping({"/v1/users", "/v2/users"})
public ResponseEntity<List<User>> getUsers() {
    return ResponseEntity.ok(userService.findAll());
}

2. Разные именования для интеграций:

@GetMapping({"/products", "/items", "/goods"})
public ResponseEntity<List<Product>> getProducts() {
    return ResponseEntity.ok(productService.findAll());
}

3. Сокращённые и полные пути:

@PostMapping({"/auth/login", "/login"})
public ResponseEntity<TokenResponse> authenticate(
    @RequestBody LoginRequest request) {
    return ResponseEntity.ok(authService.authenticate(request));
}

Важные моменты

  • Порядок обработки: Spring использует правила приоритизации маршрутов. Более специфичные пути обрабатываются раньше.
  • Конфликты: если два метода могут обрабатывать одинаковый URL, Spring выбросит исключение при запуске.
  • HTTP методы: убедитесь, что все URL в массиве должны обрабатывать одинаковый HTTP метод.
  • Производительность: Spring кэширует маршруты, поэтому наличие нескольких URL не влияет на производительность.

Рекомендации

Используйте несколько URL когда:

  • Нужна обратная совместимость со старым API
  • Интегрируются внешние системы с разными соглашениями по именованию
  • Предоставляется сокращённый вариант популярного эндпоинта

Избегайте когда:

  • Просто создаёте новый API (используйте единое именование)
  • Слишком много разных путей (усложняет документацию и тестирование)
Может ли у метода с @RequestMapping быть несколько URL? | PrepBro