Spring Bootを使ってWebアプリケーションを開発していると、「存在しないURLをブラウザから指定された場合、どうなるの?」という場面に直面します。たとえば、実際には /login
というURLしかないのに、ユーザーが /loginn
と打ち間違えた場合などですね。
このようなときにSpring Bootがどのような動きをするのか、詳しく見ていきましょう。
存在しないURLをリクエストするとどうなる?
Spring Bootでは、存在しないURLをリクエストされると、「HTTP 404 Not Found」 というエラーになります。これはWebの世界で「お探しのページは見つかりませんでした」という意味を持つ標準的なエラーです。
デフォルトではどう表示される?
Spring Bootでは、デフォルトで以下のようなシンプルなエラーページが表示されます。
Whitelabel Error Page
This application has no explicit mapping for /notfound, so you are seeing this as a fallback.
There was an unexpected error (type=Not Found, status=404).
「Whitelabel Error Page」とは?
これはSpring Bootが用意している簡易的なエラーページのことです。
例えるなら、建物の工事現場に置いてある「仮設トイレ」のようなもので、開発初期にはとりあえず使えるけれど、本番環境でそのまま使うには少し味気ない、という感じです。
オリジナルの404ページを作るには?
方法1:error/404.html
を置く
Spring Bootでは、src/main/resources/templates/error/404.html
にファイルを置くと、自動的にそのHTMLが表示されるようになります。
仕組み:
Spring Bootは、HTTPステータスコードに対応するHTMLファイルを探して表示してくれます。たとえば:
404.html
→ 404エラー(Not Found)500.html
→ 500エラー(Internal Server Error)
このように、フォルダ名とファイル名の組み合わせで、自分の好きなデザインのエラーページを出せるようになります。
方法2:@ControllerAdvice
を使って制御する
もっと柔軟にしたいときは、例外ハンドリングの機能を使うのもアリです。
@ControllerAdvice
public class CustomErrorController {
@ExceptionHandler(NoHandlerFoundException.class)
public String handle404() {
return "error/custom-404";
}
}
※この場合は、application.properties
に以下の設定も必要です:
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
エラーページをカスタマイズするメリット・デメリット
項目 | メリット | デメリット |
---|---|---|
デフォルト(Whitelabel) | 設定不要ですぐ使える | 見た目が素っ気ない |
HTMLでカスタマイズ | 好きなデザインにできる | HTMLテンプレートが必要 |
@ControllerAdvice | 動的な対応が可能 | コード量が増える |
まとめ
存在しないURLにアクセスされたとき、Spring Bootは自動的に404エラーを返します。そして、何も設定していないと「Whitelabel Error Page」が表示されます。
でも、それでは味気ないので、本番環境ではぜひカスタム404ページを作成しましょう!
次に学ぶべきこと
次は以下のトピックがおすすめです!
@ExceptionHandler
を使った例外処理の共通化- REST APIでのエラー応答フォーマットの統一(JSONで返すなど)
- Spring Bootの
ErrorController
インターフェースのカスタマイズ