Solución:
Estoy probando Spring Boot y tengo el mismo problema, y simplemente lo solucioné, publico mi solución aquí porque creo que tal vez sea útil para alguien.
Primero, coloque la clase de aplicación (que contiene el método principal) en la raíz del paquete de los controladores:
com.example.demo | +-> controller | | | +--> IndexController.java | +--> LoginController.java | +-> Application.java
Application.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring escaneará todos los componentes de los subpaquetes de manifestación paquete
IndexController.java (volver index.html vista)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = {""})
public class IndexController {
@GetMapping(value = {""})
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
}
LoginController.java (volver login.html vista)
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = {"/login"})
public class LoginController {
@GetMapping(value = {""})
public ModelAndView login() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("login");
return modelAndView;
}
}
Y ahora puedo ingresar a la vista de índice: http: // localhost: 8080 / demo / y a la vista de inicio de sesión: http: // localhost: 8080 / demo / login
Aparentemente, los controladores en diferentes paquetes no se pueden ver con la notación @springbootApplication en la clase principal. La solución explicada aquí, https://kamwo.me/java-spring-boot-mvc-ontroller-not-called/.
Para Spring-boot 1.3.xy versiones posteriores, pasar un paquete base a SpringBootApplication debería funcionar:
@SpringBootApplication(scanBasePackages = {"com.demo"})
public class DemoBootApplication {
// code
}
Esto funcionó para mí en una aplicación similar usando spring-boot 1.4.0. Para versiones anteriores de spring-boot, parece que tendrá que renunciar al uso de SpringBootApplication y, en su lugar, usará lo siguiente para obtener el mismo efecto que el anterior:
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.demo"})
public class DemoBootApplication {
// code
}
Encontré esto en los comentarios de esta publicación de blog.