Configura ViewResolver con Spring Boot e le annotazioni danno Nessun mapping trovato per la richiesta HTTP con errore URI

Sto cercando di fare l’applicazione “ciao mondo” con gradle, spring boot e spring mvc con il più semplice resolver e html.

Ho iniziato dall’esempio di avvio a molla di thymeleaf e volevo solo rimuovere thymeleaf per creare un’applicazione mvc più semplice usando puro html e InternalResourceViewResolver. Ho un singolo saluto.html Voglio servire che si trova su src / main / webapp / WEB-INF. Quando eseguo l’app, ottengo

No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet' 

Questo è un errore comune e ci sono molte risposte sul web ma nulla sembra aiutare.

Ecco il mio Application.java

 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

Ecco il mio GreetingController.java

 @Controller public class GreetingController { @RequestMapping("/greeting") public String greeting() { return "greeting"; } } 

Ecco il mio 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 gradle bootRun con gradle bootRun

Ecco il repository con il codice: https://github.com/driver-pete/spring-mvc-example

Ecco alcuni altri indizi:

  • La risoluzione della vista Thymeleaf funziona correttamente
  • InternalResourceViewResolver si risolve nel percorso corretto
  • WEB-INF e greeting.html sembrano essere presenti nel file di guerra
  • Non ho jsp o jstl quindi non mi manca quei vasi come qualcuno potrebbe suggerire

La mia ipotesi è che il servlet di dispatcher sia configurato per funzionare su / * invece che su / come qui e ovunque. Tuttavia non ho web.xml quindi questi consigli non si applicano qui. Vedo molti esempi su come configurare il servlet di dispatcher a livello di codice, ma voglio mantenere la mia app al minimo e sospetto che il boot di spring debba configurarlo ok dato che funziona bene con thymeleaf.

Hai solo bisogno di abilitare il servlet predefinito, questo viene fatto aggiungendo quanto segue alla tua 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(); } } 

Essenzialmente ciò che sta succedendo è che Spring non sa come gestire la gestione di tali contenuti in modo nativo (potrebbe essere un jsp dire), e questa configurazione è il modo di dirgli di delegarli al contenitore.

Dopo aver analizzato di più ho scoperto una soluzione alternativa che funziona senza aggiungere il metodo configureDefaultServletHandling. È necessario aggiungere un motore jsp tomcat incorporato a build.gradle:

 compile("org.apache.tomcat.embed:tomcat-embed-jasper") 

A differenza del metodo configureDefaultServletHandling, questa soluzione funziona non solo con html semplice ma anche con jsp.

Tutte le soluzioni sono disponibili all’indirizzo: https://github.com/driver-pete/spring-mvc-example Questa soluzione è disponibile su master. La soluzione di Biju è sul ramo DefaultServletHandling_solution.

View resolver può anche essere configurato nel file application.properties delle applicazioni web Spring-Boot, qualcosa di simile di seguito:

 spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp