java - requestmapping - Configure ViewResolver con Spring Boot y las anotaciones dan No se encontró una asignación para la solicitud HTTP con error de URI
spring mvc tutorial (3)
Después de investigar más, descubrí una solución alternativa que funciona sin agregar el método configureDefaultServletHandling. Debe agregar un motor jp de tomcat integrado a build.gradle:
compile("org.apache.tomcat.embed:tomcat-embed-jasper")
A diferencia del método configureDefaultServletHandling, esta solución funciona no solo con html simple sino también con jsp.
Todas las soluciones están disponibles en: https://github.com/driver-pete/spring-mvc-example Esta solución está disponible en master. La solución de Biju está en la rama DefaultServletHandling_solution.
Estoy tratando de hacer la aplicación "hello world" con gradle, spring boot y spring mvc con la resolución más simple de resoluciones y html.
Comencé con el ejemplo de la bota de resorte de la hoja de laurel y solo quería eliminar la hoja de tomillo para hacer una aplicación de mvc más simple usando html puro y InternalResourceViewResolver. Tengo un único saludo.html Quiero servir, que se encuentra en src / main / webapp / WEB-INF. Cuando ejecuto la aplicación obtengo
No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name ''dispatcherServlet''
Este es un error común y hay muchas respuestas en la web, pero nada parece ayudar.
Aquí está mi Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Aquí está mi GreetingController.java
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting() {
return "greeting";
}
}
Aquí está mi MvcConfiguration.java
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
}
Lo ejecuto con gradle bootRun
Aquí está el repositorio con el código: https://github.com/driver-pete/spring-mvc-example
Aquí hay algunas pistas más:
- La resolución de la vista de Thymeleaf funciona bien
- InternalResourceViewResolver se resuelve en la ruta correcta
- WEB-INF y greeting.html parece estar presente en el archivo de guerra
- No tengo jsp o jstl, así que no echo de menos esos frascos ya que algunos podrían sugerir
Mi hipótesis es que el servlet dispatcher de alguna manera se configura para que se publique en / * en lugar de / like here y en todas partes. Sin embargo, no tengo web.xml, por lo que esos consejos no se aplican aquí. Veo muchos ejemplos de cómo configurar el servlet de distribución mediante programación, pero quiero mantener mi aplicación al mínimo y sospecho que se supone que el arranque de primavera lo configure bien, ya que funciona bien con thymeleaf.
Solo necesita habilitar el servlet predeterminado, esto se hace agregando lo siguiente a su MvcConfiguration
:
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
Básicamente, lo que está sucediendo es que Spring no sabe cómo manejar el contenido de forma nativa (podría ser un jsp) y para esta configuración es la forma de decirle que lo delegue en el contenedor.
View resolver también se puede configurar en el archivo application.properties
de las aplicaciones web Spring-Boot, como a continuación:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp