【Spring Boot】Controllerが正しく動かない原因

Spring Bootプロジェクトで画面遷移のハンドリングが出来なかった時のエラー内容と原因をメモ。


画面からフォームボタンのPOSTリクエスト時。

リソースに辿り着けない。。


Controllerのソース

POSTリクエストでconfirm.htmlへ遷移させたい。

@Controller
public class MainController {

	@RequestMapping(value="/", method=RequestMethod.GET)
	public String index() {
		return "index";
	}

	@RequestMapping(value="/confirm", method=RequestMethod.POST)
	public String confirm() {
		return "confirm";
	}
}

 

エラーの原因 : Controllerのクラスファイルの配置場所が正しくない。

Controllerをはじめ、Spring Bootプロジェクトで使用する全てのクラスファイルは
プロジェクトのmainメソッド(SpringApplication.run)がある起動クラスと同一パッケージ
もしくはその配下に配置しないと正しくロードされない。


パッケージの配置が正しくない状態

プロジェクトの起動クラスのパッケージと異なるパッケージに
Controllerのクラスファイルがある。


パッケージを正しい位置に変更

プロジェクトを再起動し、画面側の送信ボタンでControllerへPOSTリクエストする。

プロジェクト内でコンソールのログを確認する。
(一部のみ抜粋)
Controllerのクラスファイル名「MainController」で文字列検索

Mapped “{[/],methods=[GET]}” onto public java.lang.String example.presentation.controller.MainController.index()
2018-10-12 10:20:09.838 INFO 1002 — [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped “{[/confirm],methods=[POST]}” onto public java.lang.String example.presentation.controller.MainController.confirm()

Controllerクラスがロードされ、メソッドの呼び出しも確認できる。

エラーの落とし穴

プロジェクト起動後 http://localhost:8080/で初回アクセス時、
Controllerがロードされていなかった場合、
ファイル名がindex.htmlのテンプレートを自動で返す仕様となっているため
エラーに気付きにくかった。

Follow me!