web-dev-qa-db-fra.com

Configurez ViewResolver avec Spring Boot et les annotations donnent Aucun mappage trouvé pour une requête HTTP avec une erreur URI

J'essaie de faire une application "hello world" avec gradle, spring boot et spring mvc avec le résolveur de vues et le html les plus simples.

J'ai commencé à partir du exemple de démarrage de thymeleaf spring et je voulais simplement supprimer thymeleaf pour créer une application mvc plus simple à l'aide de HTML pur et de InternalResourceViewResolver. J'ai une seule salutation.html Je veux servir, située à l'adresse src/main/webapp/WEB-INF. Quand je lance l'application, je reçois

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

C'est une erreur courante et il y a beaucoup de réponses sur le web, mais rien ne semble aider.

Voici mon application.Java

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

Voici mon GreetingController.Java

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

Voici mon 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;
    }
}

Je le lance avec gradle bootRun

Voici le repo avec le code: https://github.com/driver-pete/spring-mvc-example

Voici quelques indices supplémentaires:

  • La résolution de vue Thymeleaf fonctionne bien
  • InternalResourceViewResolver est résolu dans le bon chemin
  • WEB-INF et greeting.html semblent être présents dans le fichier de guerre
  • Je n'ai pas jsp ou jstl donc je ne manque pas ces pots comme certains pourraient le suggérer

Mon hypothèse est que les servlets répartiteurs sont configurés de manière à servir sur/* au lieu de/comme ici et partout. Cependant, je n'ai pas web.xml, donc ces conseils ne s'appliquent pas ici. Je vois beaucoup d'exemples sur la façon de configurer le servlet Dispatcher par programmation, mais je veux garder mon application au minimum et je soupçonne que Spring Boot est censé le configurer correctement car il fonctionne bien avec thymeleaf.

30
otognan

Vous devez uniquement activer le servlet par défaut. Pour ce faire, ajoutez les éléments suivants à votre 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();
    }    
}

Ce qui se passe en réalité, c'est que Spring ne sait pas comment gérer le traitement de ce contenu de manière native (par exemple, jsp), et cette configuration est le moyen de lui indiquer de le déléguer au conteneur.

47
Biju Kunjummen

Après avoir étudié davantage, j'ai découvert une solution alternative qui fonctionne sans ajouter de méthode configureDefaultServletHandling. Vous devez ajouter un moteur jsp Tomcat intégré à build.gradle:

compile("org.Apache.Tomcat.embed:Tomcat-embed-jasper")

Contrairement à la méthode configureDefaultServletHandling, cette solution fonctionne non seulement avec le langage HTML mais également avec jsp.

Toutes les solutions sont disponibles à l'adresse suivante: https://github.com/driver-pete/spring-mvc-example Cette solution est disponible à la base. La solution de Biju se trouve sur la branche DefaultServletHandling_solution.

13
otognan

Le résolveur de vues peut également être configuré dans application.properties fichier des applications Web Spring-Boot, comme ci-dessous:

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