Как в Spring MVC указать HTTP-метод для обработчика запроса?

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

Ответ

HTTP-метод для обработчика запросов в Spring MVC указывается с помощью специализированных аннотаций уровня метода. Эти аннотации являются мета-аннотациями над @RequestMapping с предустановленным методом.

Основные аннотации (Spring 4.3+):

  • @GetMapping — для GET запросов (извлечение данных).
  • @PostMapping — для POST запросов (создание ресурса).
  • @PutMapping — для PUT запросов (полное обновление ресурса).
  • @DeleteMapping — для DELETE запросов (удаление ресурса).
  • @PatchMapping — для PATCH запросов (частичное обновление).

Универсальная аннотация @RequestMapping: Можно использовать её, явно указав метод (актуально для старых версий Spring или нестандартных методов).

@RequestMapping(value = "/api/users", method = RequestMethod.GET)

Практический пример в @RestController:

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

    @GetMapping // Обрабатывает GET /api/users
    public List<User> getAllUsers() {
        return userService.findAll();
    }

    @GetMapping("/{id}") // Обрабатывает GET /api/users/{id}
    public User getUserById(@PathVariable Long id) {
        return userService.findById(id);
    }

    @PostMapping // Обрабатывает POST /api/users
    @ResponseStatus(HttpStatus.CREATED)
    public User createUser(@RequestBody @Valid UserDto userDto) {
        return userService.create(userDto);
    }

    @PutMapping("/{id}") // Обрабатывает PUT /api/users/{id}
    public User updateUser(@PathVariable Long id, @RequestBody UserDto userDto) {
        return userService.update(id, userDto);
    }

    @DeleteMapping("/{id}") // Обрабатывает DELETE /api/users/{id}
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

Важно: DispatcherServlet использует HandlerMapping для сопоставления входящего HTTP-запроса (URL + метод) с соответствующим методом контроллера на основе этих аннотаций.