【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()
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のテンプレートを自動で返す仕様となっているため
エラーに気付きにくかった。