Erreur de débogage du Spring MVC 404 «Aucun mappage trouvé pour la requête HTTP»

1. Introduction

Spring MVC est une application traditionnelle construite à l'aide du modèle de contrôleur frontal. DispatcherServlet, qui agit en tant que contrôleur frontal, est responsable du routage et du traitement des demandes.

Comme pour toute application Web ou site Web, Spring MVC renvoie le code de réponse HTTP 404 lorsque la ressource demandée est introuvable. Dans ce didacticiel, nous examinerons les causes courantes des erreurs 404 dans Spring MVC .

2. Causes possibles de la réponse 404

2.1. URI incorrect

Disons que nous avons un GreetingController qui est mappé à / salutation et rend le message salutation.jsp :

@Controller public class GreetingController { @RequestMapping(value = "/greeting", method = RequestMethod.GET) public String get(ModelMap model) { model.addAttribute("message", "Hello, World!"); return "greeting"; } }

La vue correspondante rend la valeur de la variable de message :

   Greeting   

${message}

Comme prévu, faire une requête GET à / greet fonctionne:

curl //localhost:8080/greeting

Nous verrons une page HTML avec le message "Hello World":

  Greeting   

Hello, World!

L'une des raisons les plus courantes de voir 404 est l'utilisation d'un URI incorrect. Par exemple, il serait erroné de faire une requête GET à / greetings au lieu de / greet :

curl //localhost:8080/greetings

Dans un tel cas, nous verrions un message d'avertissement dans les journaux du serveur:

[http-nio-8080-exec-6] WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/greetings] in DispatcherServlet with name 'mvc'

Et le client verrait une page d'erreur:

  Home   

Pour éviter cela, nous devons nous assurer que nous avons correctement saisi l'URI.

2.2. Mappage de servlet incorrect

Comme expliqué précédemment, DispatcherServlet est le contrôleur frontal de Spring MVC. Par conséquent, tout comme dans une application standard basée sur un servlet, nous devons créer un mappage pour le servlet à l'aide du fichier web.xml .

Nous définissons le servlet à l'intérieur de la balise servlet et le mappons à un URI à l'intérieur de la balise de mappage de servlet . Nous devons nous assurer que la valeur de url-pattern est correcte car il est assez courant de voir des suggestions où le servlet est mappé à «/ *» - notez l'astérisque de fin :

    mvc org.springframework.web.servlet.DispatcherServlet 1   mvc /*   

Maintenant, si nous demandons / saluons , nous verrions un avertissement dans les journaux du serveur:

curl //localhost:8080/greeting
WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/WEB-INF/view/greeting.jsp] in DispatcherServlet with name 'mvc'

Cette fois, l'erreur indique que salutation.jsp est introuvable et l'utilisateur voit une page vierge.

Pour corriger l'erreur, nous devons mapper DispatcherServlet sur «/» (sans l'astérisque de fin) à la place:

 mvc / 

Après avoir corrigé le mappage, tout devrait fonctionner correctement. La demande / salutation affiche maintenant le message "Hello, World!"

curl //localhost:8080/greeting
  Greeting   

Hello, World!

The reasoning behind the problem is that if we map DispatcherServlet to /*, then we are telling the application that every single request arriving at our application is to be served by DispatcherServlet. However, that's not a correct approach because DispatcherServlet is not capable of doing this. Instead, Spring MVC expects an implementation of ViewResolver to serve views such as JSP files.

3. Conclusion

Dans cet article rapide, nous avons expliqué comment déboguer les erreurs 404 dans Spring MVC. Nous sommes passés par les deux raisons les plus courantes pour recevoir une réponse 404 de notre application Spring. Le premier utilisait un URI incorrect lors de la demande. La seconde était de mapper le DispatcherServlet avec le mauvais modèle d'url dans web.xml .

Comme toujours, la mise en œuvre complète de ce tutoriel est disponible sur Github.