Почему DispatcherServlet не находит контроллер в контексте приложения Spring?

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

Ответ

DispatcherServlet не может найти контроллер по нескольким основным причинам, связанным с конфигурацией и аннотациями.

Основные причины:

  1. Отсутствие аннотации контроллера – класс не помечен как @Controller или @RestController.
  2. Неправильное сканирование компонентов – пакет с контроллером не указан в @ComponentScan или находится за пределами базового пакета сканирования.
  3. Конфликт URL-маппинга – путь, указанный в @RequestMapping, @GetMapping и других аннотациях, не совпадает с входящим HTTP-запросом.
  4. Отсутствие конфигурации MVC – в проектах без Spring Boot может потребоваться явное включение @EnableWebMvc или настройка WebMvcConfigurer.
  5. Контроллер не является Spring-бином – класс не управляется Spring IoC-контейнером (например, создан через new).

Пример корректного контроллера:

@RestController // Или @Controller
@RequestMapping("/api")
public class MyController {
    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("OK");
    }
}

Что проверить:

  • Наличие аннотаций @Controller/@RestController на классе.
  • Корректность базового пакета в @SpringBootApplication или @ComponentScan.
  • Логи запуска приложения на предмет сообщений типа Mapped "{[/api/test],methods=[GET]}".
  • Соответствие HTTP-метода (GET, POST) и пути в запросе аннотациям контроллера.