web-dev-qa-db-fra.com

Pourquoi Spring MVC répond-il par un message 404 et signale-t-il "Aucun mappage trouvé pour la requête HTTP avec l'URI [...] dans DispatcherServlet"?

J'écris une application Spring MVC déployée sur Tomcat. Voir l'exemple suivant { exemple minimal, complet et vérifiable } _

public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { };
    }
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { SpringServletConfig.class };
    }
    protected String[] getServletMappings() {
        return new String[] { "/*" };
    }
}

SpringServletConfig est 

@Configuration
@ComponentScan("com.example.controllers")
@EnableWebMvc
public class SpringServletConfig {
    @Bean
    public InternalResourceViewResolver resolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/jsps/");
        vr.setSuffix(".jsp");
        return vr;
    }
}

Enfin, j'ai un @Controller dans le package com.example.controllers

@Controller
public class ExampleController {
    @RequestMapping(path = "/home", method = RequestMethod.GET)
    public String example() {
        return "index";
    }
}

Le nom de contexte de mon application est Example. Quand j'envoie une demande à

http://localhost:8080/Example/home

l'application répond avec un statut HTTP 404 et enregistre les informations suivantes

WARN  o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI `[/Example/WEB-INF/jsps/index.jsp]` in `DispatcherServlet` with name 'dispatcher'

J'ai une ressource JSP à l'adresse /WEB-INF/jsps/index.jsp Je m'attendais à ce que Spring MVC utilise mon contrôleur pour gérer la demande et la transmettre au JSP, alors pourquoi répond-il avec un 404?


Ceci est censé être une publication canonique pour les questions concernant ce message d’avertissement.

68

J'ai résolu mon problème quand en plus de décrit avant:

@Bean
public InternalResourceViewResolver resolver() {
    InternalResourceViewResolver vr = new InternalResourceViewResolver();
    vr.setPrefix("/WEB-INF/jsps/");
    vr.setSuffix(".jsp");
    return vr;
}

added Tomcat-embed-jasper:

<dependency>
       <groupId>org.Apache.Tomcat.embed</groupId>
        <artifactId>Tomcat-embed-jasper</artifactId>
       <scope>provided</scope>
</dependency>

` from: Le fichier JSP ne s'affiche pas dans l'application Web Spring Boot

2
RoutesMaps.com

Je suis tombé sur une autre raison de la même erreur. Cela peut également être dû aux fichiers de classe non générés pour votre fichier controller.Java. En conséquence, le servlet de distributeur mentionné dans web.xml est incapable de le mapper à la méthode appropriée dans la classe de contrôleur.

@Controller
Class Controller{
@RequestMapping(value="/abc.html")//abc is the requesting page
public void method()
{.....}
}

Dans Eclipse sous Projet-> sélectionnez Nettoyer -> Construire un projet. Vérifiez si le fichier de classe a été généré pour le fichier du contrôleur sous les constructions de votre espace de travail.

0
Anil N.P

Pour moi, j'ai constaté que mes classes cibles avaient été générées dans un modèle de dossier différent de celui de la source. C’est peut-être dans Eclipse que j’ajoute des dossiers pour contenir mes contrôleurs sans les ajouter en tant que packages. J'ai donc fini par définir un chemin incorrect dans la configuration de printemps.

Ma classe cible générait des classes sous application et je faisais référence à com.happy.app

<context:annotation-config />
<context:component-scan
    base-package="com.happy.app"></context:component-scan> 

J'ai ajouté des packages (pas des dossiers) pour com.happy.app et déplacé les fichiers de dossiers vers des packages dans Eclipse, ce qui a résolu le problème.

0
Roy

Dans mon cas, je suivais la documentation Interceptors Spring pour la version 5.1.2 (en utilisant Spring Boot v2.0.4.RELEASE) et la classe WebConfig avait l'annotation @EnableWebMvc, qui semblait être en conflit avec quelque chose d'autre dans mon application empêchant la résolution correcte de mes actifs statiques (c'est-à-dire qu'aucun fichier CSS ou JS n'a été renvoyé au client).

Après avoir essayé beaucoup de choses différentes, j’ai essayé enlever le @EnableWebMvc et cela a fonctionné!

Edit: Voici la documentation de référence qui dit que vous devez supprimer l'annotation @EnableWebMvc

Apparemment, du moins dans mon cas, je suis déjà en train de configurer mon application Spring (bien que ce ne soit pas en utilisant web.xml ou tout autre fichier statique, c'est définitivement par programme), donc c'était un conflit là-bas.

0
Acapulco