<目次>
(1) JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について
(1-1) エラー概要
(1-2) 原因
(1-3) 対処法
(1) JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について
(1-1) エラー概要
今回はSpring Bootでプロジェクトを作成し、それをEclipseで読み込んで疎通をしようとした際に、pom.xml(Maven(※注1)プロジェクトの設定ファイル)で「Unknown error」が出ました。
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sun Sep 05 23:13:21 JST 2021
There was an unexpected error (type=Not Found, status=404).
(図111)①エラーメッセージ
(図111)②メインアプリケーションクラス
(図111)③新規作成したコントローラークラス
(※注1)
MavenはJavaベースのプロジェクトで使用され、ビルドの管理や、依存性&そのバージョン管理等を行います。
エラーの再現手順や、環境のバージョン情報は以下の通りです。
(バージョン情報)
・Eclipse 4.7.2
・Java 1.8.0_231
(再現手順)
・①Spring Initializer(https://start.spring.io/)でMavenプロジェクトを作成
・②上記で生成したzipファイルをJDK、Eclipseがインストールされたサーバに配置して解凍
・③EclipseよりMavenプロジェクトをインポート
・④コントローラのクラスを作成&実装(疎通用のHelloWorldメソッドを実装)
・⑤xxxApplication.javaの実行(xxxはご自身が「https://start.spring.io/」で入力したArtifactの値)
(1-2) 原因
直接原因はコントローラークラス(HelloWorldController)がスキャン対象に含まれていないためでした。
デフォルトでは、部品のスキャン対象はメインのクラスが属するパッケージ(例では「com.rainbowengine.springboothelloworldsample」)配下と、その更に配下のサブパッケージが対象となります。しかし、今回新規に作成したコントローラークラス(HelloWorldController)はメインのクラスが属するパッケージ配下でもなく、そのサブパッケージ配下でも無いためスキャンされていませんでした。
(1-3) 対処法
このようなケースでは、未スキャンのパッケージを明示的にスキャンする必要があります。そのため、メインのクラスの「@SpringBootApplication」の下あたりに次の内容を追記します。
//#(構文)
@ComponentScan(basePackageClasses = [スキャン対象のクラス名].class)
//#(例)追記後のクラス全体
package com.rainbowengine.springboothelloworldsample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import com.rainbowengine.controller.HelloWorldController;
@SpringBootApplication
@ComponentScan(basePackageClasses = HelloWorldController.class)
public class SpringBootHelloWorldSampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootHelloWorldSampleApplication.class, args);
}
}
(1-4) 参考:ComponentScanとは?
Spring Bootのアプリ開発では
アノテーションを使って、必要なクラスを明示的にSpringの処理の中に組み込ませる必要があります(これを部品のスキャン=Scanと呼んでいます)。この機能は毎回の処理で全ての部品を読み込む必要はない、という発想から来ており、処理の効率化に寄与しています。このScanは「@ComponentScan」アノテーションを使って指示する事が出来ます。
(構文)
@ComponentScan(basePackageClasses = [スキャン対象のクラス名].class)
この構文ではクラス指定でスキャンを行います。引数を指定しなかった場合は、パッケージ配下を再帰的に全てスキャンする事も出来ます。