Может ли контроллер Spring отсутствовать в контексте приложения?

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

Ответ

Да, контроллер Spring может отсутствовать в ApplicationContext, если он не был корректно зарегистрирован как Spring bean. Это распространённая проблема конфигурации.

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

  1. Отсутствие стереотипной аннотации: Класс не помечен аннотацией @Controller, @RestController или @Component.
  2. Вне области сканирования компонентов: Пакет с контроллером не указан в @ComponentScan или не находится в пакете корневого класса приложения.
  3. Неправильная конфигурация в тестах: Использование @SpringBootTest вместо @WebMvcTest для тестирования конкретного контроллера или отсутствие моков необходимых бинов.

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

// Без аннотации @RestController этот класс не будет управляться Spring.
// Он не станет частью контекста, и его эндпоинты не будут зарегистрированы.
public class MissingAnnotationController {
    @GetMapping("/home") // Эта аннотация ничего не делает без @RestController
    public String home() { return "home"; }
}

Как проверить:

// В коде приложения или теста
String[] beanNames = applicationContext.getBeanDefinitionNames();
// Искать имя своего контроллера среди beanNames
// Или попробовать получить бин:
// MyController controller = applicationContext.getBean(MyController.class);