Foutopsporing voor de Spring MVC 404 "Geen toewijzing gevonden voor HTTP-verzoek"

1. Inleiding

Spring MVC is een traditionele applicatie die is gebouwd met behulp van het Front Controller Pattern. VerzenderServlet, die fungeert als de frontcontroller, verantwoordelijk is voor routing en verzoekverwerking.

Zoals bij elke webtoepassing of website, retourneert Spring MVC de HTTP 404-antwoordcode wanneer de gevraagde bron niet kan worden gevonden. In deze tutorial zullen we kijken naar veelvoorkomende oorzaken van 404-fouten in Spring MVC.

2. Mogelijke oorzaken voor 404-respons

2.1. Verkeerde URI

Laten we zeggen dat we een Groetcontroller dat is toegewezen aan /groet en rendert groet.jsp:

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

De bijbehorende weergave geeft de waarde van de bericht variabele:

   Groet 

$ {bericht}

Zoals verwacht, doet u een GET-verzoek aan /groet werken:

curl // localhost: 8080 / groet

We zien een HTML-pagina met het bericht "Hallo wereld":

  Groet 

Hallo Wereld!

Een van de meest voorkomende redenen om 404 te zien, is het gebruik van een onjuiste URI. Het zou bijvoorbeeld verkeerd zijn om een ​​GET-verzoek in te dienen bij /groeten in plaats van /groet:

curl // localhost: 8080 / groeten

In dat geval zien we een waarschuwingsbericht in de serverlogboeken:

[http-nio-8080-exec-6] WARN o.s.web.servlet.PageNotFound - Geen mapping gevonden voor HTTP-verzoek met URI [/ greetings] in DispatcherServlet met naam 'mvc'

En de klant zou een foutpagina zien:

  Huis 

Om dit te voorkomen, moeten we ervoor zorgen dat we de URI correct hebben ingevoerd.

2.2. Onjuiste Servlet-toewijzing

Zoals eerder uitgelegd, DispatcherServlet is de frontcontroller in Spring MVC. Daarom moeten we, net als in een standaard op servlet gebaseerde toepassing, een afbeelding voor de servlet maken met behulp van de web.xml het dossier.

We definiëren de servlet binnen de servlet tag en wijs deze toe aan een URI in de servlet-mapping label. We moeten ervoor zorgen dat de waarde van url-patroon is correct omdat het vrij normaal is om suggesties te zien waar de servlet is toegewezen aan "/ *" - let op de achterlopende asterisk:

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

Nu, als we erom vragen /groet, we zouden een waarschuwing zien in de serverlogboeken:

curl // localhost: 8080 / groet
WARN o.s.web.servlet.PageNotFound - Geen mapping gevonden voor HTTP-verzoek met URI [/WEB-INF/view/greeting.jsp] in DispatcherServlet met naam 'mvc'

Deze keer stelt de fout dat groet.jsp wordt niet gevonden en de gebruiker ziet een lege pagina.

Om de fout op te lossen, moeten we een map in kaart brengen DispatcherServlet naar "/" (zonder de achterlopende asterisk) in plaats daarvan:

 mvc / 

Nadat de mapping is hersteld, zou alles correct moeten werken. Verzoekend /groet toont nu het bericht "Hallo, wereld!":

curl // localhost: 8080 / groet
  Groet 

Hallo Wereld!

De redenering achter het probleem is dat als we in kaart brengen DispatcherServlet naar /*, dan vertellen we de applicatie dat elk verzoek dat bij onze applicatie binnenkomt, moet worden beantwoord door DispatcherServlet. Dat is echter geen correcte benadering, want DispatcherServlet is hiertoe niet in staat. In plaats daarvan verwacht Spring MVC een implementatie van ViewResolver om weergaven zoals JSP-bestanden te dienen.

3. Conclusie

In dit korte artikel hebben we uitgelegd hoe u 404-fouten kunt opsporen in Spring MVC. We hebben de twee meest voorkomende redenen besproken voor het ontvangen van een 404-reactie van onze Spring-applicatie. De eerste was het gebruik van een onjuiste URI tijdens het maken van het verzoek. De tweede was het in kaart brengen van de DispatcherServlet naar de verkeerde kant url-patroon in web.xml.

Zoals altijd is de volledige implementatie van deze tutorial te vinden op Github.