Spring MVC 404「HTTPリクエストのマッピングが見つかりません」エラーのデバッグ

1. 前書き

Spring MVCは、Front Controller Patternを使用して構築された従来のアプリケーションです。 フロントコントローラーとして機能する_https://www.baeldung.com/spring-dispatcherservlet [DispatcherServlet]、_は、ルーティングと要求処理を担当します。
他のWebアプリケーションまたはWebサイトと同様に、要求されたリソースが見つからない場合、Spring MVCはHTTP 404応答コードを返します。 このチュートリアルでは、* Spring MVCでの404エラーの一般的な原因*を見ていきます。

2. 404応答の考えられる原因

2.1. 間違ったURI

_ / greeting_にマッピングされ、_greeting.jsp_をレンダリングするa __GreetingController __があるとします。
@Controller
public class GreetingController {

    @RequestMapping(value = "/greeting", method = RequestMethod.GET)
    public String get(ModelMap model) {
        model.addAttribute("message", "Hello, World!");
        return "greeting";
    }
}
対応するビューは、_message_変数の値をレンダリングします。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Greeting</title>
    </head>
    <body>
        <h2>${message}</h2>
    </body>
</html>
予想どおり、_ / greeting_にGETリクエストを送信すると機能します。
curl http://localhost:8080/greeting
「Hello World」というメッセージを含むHTMLページが表示されます。
<html>
    <head>
        <title>Greeting</title>
    </head>
    <body>
        <h2>Hello, World!</h2>
    </body>
</html>
404が表示される最も一般的な理由の1つは、誤ったURIを使用していることです。 たとえば、_ / greeting_の代わりに_ / greetings_にGET要求を行うのは間違っています。
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_ファイルを使用してサーブレットのマッピングを作成する必要があります。
__servlet __tag内でサーブレットを定義し、_servlet-mapping_タグ内のURIにマッピングします。 サーブレットが「//」にマップされている場所では末尾のアスタリスクに注意してください。
<?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. 結論

この簡単な記事では、Spring MVCで404エラーをデバッグする方法を説明しました。 Springアプリケーションから404応答を受信する最も一般的な2つの理由を調べました。 1つ目は、リクエストの作成中に誤ったURIを使用していました。 2番目は、_DispatcherServlet_を_web.xml_の間違った_url-pattern_にマッピングしていました。
いつものように、このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-xml[Github上]にあります。