Spring -boot w/embedded tomcat не отправляет запросы контроллеру - программирование
Подтвердить что ты не робот

Spring -boot w/embedded tomcat не отправляет запросы контроллеру

У меня есть приложение, использующее spring -boot и встроенный контейнер Tomcat.

Насколько я могу судить, мой код такой же, как в примере spring -boot . Тем не менее, когда я запускаю свой тест, я получаю 404 вместо 200 (в случае, когда я пытаюсь опубликовать вместо того, чтобы получить, я получаю 405, что согласуется с неправильной настройкой Tomcat):

Failed tests:
UserControllerTest.testMethod:45 Status expected:<200> but was:<404>

Моя конфигурация на основе Java (некоторые классы конфигурации опущены):

@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({ ServiceConfig.class, DefaultRepositoryConfig.class })
public class ApplicationConfig {

    private static Log logger = LogFactory.getLog(ApplicationConfig.class);

    public static void main(String[] args) {
        SpringApplication.run(ApplicationConfig.class);
    }

    @Bean
    protected ServletContextListener listener() {
        return new ServletContextListener() {
            @Override
            public void contextInitialized(ServletContextEvent sce) {
                logger.info("ServletContext initialized");
            }

            @Override
            public void contextDestroyed(ServletContextEvent sce) {
                logger.info("ServletContext destroyed");
            }
        };
    }
}

UserController.java:

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

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<String> testMethod() {
        return new ResponseEntity<>("Success!", HttpStatus.OK);
    }
}

UserControllerTest.java:

RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfig.class})
public class UserControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
    }

    @Test
    public void testMethod() throws Exception {
        this.mockMvc.perform(get("/")).andExpect(status().isOk());
    }
}

Есть ли что-то основное, что мне не хватает? Я не предоставляю свою собственную конфигурацию Mvc, и я не коснулся Spring MVC DispatcherServlet, поэтому я предполагаю, что spring -boot автоматически настроит Tomcat.

4b9b3361

Ответ 1

Оказывается, проблема заключается в конфигурации сканирования компонентов. Несмотря на то, что была использована аннотация @ComponentScan, контроллер находился под отдельным пакетом, поэтому Spring никогда не включал его в диспетчер.

Добавление @ComponentScan(basePackages = "com.my.controller")) решило мою проблему.