Что произойдет, если аннотировать один метод контроллера Spring и @RequestMapping, и @PostMapping?

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

Ответ

Spring MVC не поддерживает множественное сопоставление одного метода с разными аннотациями запросов. Будет применена только одна из аннотаций, что приведет к неопределенному поведению (зависит от порядка сканирования). Это считается ошибкой конфигурации.

Неправильный пример (избегайте этого):

@Controller
public class MyController {
    // КОНФЛИКТ: Метод будет сопоставлен только с одной аннотацией.
    @RequestMapping(path = "/api", method = RequestMethod.POST)
    @PostMapping("/api")
    public ResponseEntity<String> create() {
        return ResponseEntity.ok("created");
    }
}

Правильный подход: Используйте одну, наиболее конкретную аннотацию.

// Правильно: используйте только @PostMapping для ясности.
@PostMapping("/api")
public ResponseEntity<String> create() {
    return ResponseEntity.ok("created");
}

// Или, что эквивалентно, только @RequestMapping.
@RequestMapping(path = "/api", method = RequestMethod.POST)
public ResponseEntity<String> createAlternative() {
    return ResponseEntity.ok("created");
}

Почему так? Аннотации @GetMapping, @PostMapping и др. являются мета-аннотациями, сами помеченными @RequestMapping. Навешивание двух таких аннотаций создает конфликтующую мета-информацию для HandlerMapping.