Перейти к основному содержимому

Отладка ошибки Spring MVC 404 «Не найдено сопоставление для HTTP-запроса»

· 3 мин. чтения

1. Введение

Spring MVC — это традиционное приложение, созданное с использованием шаблона Front Controller. DispatcherServlet , выступающий в роли переднего контроллера, отвечает за маршрутизацию и обработку запросов.

Как и в случае любого веб-приложения или веб-сайта, Spring MVC возвращает код ответа HTTP 404, когда запрошенный ресурс не может быть найден. В этом руководстве мы рассмотрим распространенные причины ошибок 404 в Spring MVC .

2. Возможные причины ответа 404

2.1. Неверный URI

Допустим, у нас есть GreetingController , который сопоставляется с /greeting и отображает Greeting.jsp :

@Controller
public class GreetingController {

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

Соответствующее представление отображает значение переменной сообщения :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>

Как и ожидалось, GET-запрос к /greeting работает:

curl http://localhost:8080/greeting

Мы увидим HTML-страницу с сообщением «Hello World»:

<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>

Одной из наиболее распространенных причин появления ошибки 404 является использование неправильного URI. Например, было бы неправильно делать запрос GET к /greetings вместо /greeting :

curl http://localhost:8080/greetings

В таком случае мы увидим предупреждающее сообщение в журналах сервера:

[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'

И клиент увидит страницу с ошибкой:

<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Http Error Code : 404. Resource not found</h1>
</body>
</html>

Чтобы этого избежать, нам нужно убедиться, что мы ввели правильный URI.

2.2. Неправильное отображение сервлета

Как объяснялось ранее, DispatcherServlet является передним контроллером в Spring MVC. Следовательно, как и в стандартном приложении на основе сервлета, нам необходимо создать сопоставление для сервлета с помощью файла web.xml .

Мы определяем сервлет внутри тега сервлета и сопоставляем его с URI внутри тега отображения сервлета . Нам нужно убедиться, что значение url-pattern верное, потому что довольно часто можно увидеть предложения, где сервлет отображается на «/*» — обратите внимание на звездочку в конце :

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- Additional config omitted -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Additional config omitted -->
</web-app>

Теперь, если мы запросим /greeting , мы увидим предупреждение в журналах сервера:

curl http://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'

На этот раз ошибка гласит, что Greeting.jsp не найден, и пользователь видит пустую страницу.

Чтобы исправить ошибку, нам нужно вместо этого сопоставить DispatcherServlet с «/» (без завершающей звездочки):

<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

После исправления маппинга все должно работать корректно. При запросе /greeting теперь отображается сообщение «Hello, World!»:

curl http://localhost:8080/greeting
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>

Причина проблемы заключается в том, что если мы сопоставляем DispatcherServlet с /* , то мы сообщаем приложению, что каждый отдельный запрос, поступающий в наше приложение, должен обслуживаться DispatcherServlet . Однако это неправильный подход, поскольку DispatcherServlet не может этого сделать. Вместо этого Spring MVC ожидает, что реализация ViewResolver будет обслуживать такие представления, как файлы JSP.

3. Заключение

В этой быстрой статье мы объяснили, как отлаживать ошибки 404 в Spring MVC. Мы рассмотрели две наиболее распространенные причины получения ответа 404 от нашего приложения Spring. Во-первых, при выполнении запроса использовался неверный URI. Вторым было сопоставление DispatcherServlet с неправильным шаблоном URL-адреса в web.xml .

Как всегда, полную реализацию этого туториала можно найти на Github .