この教材を進める中で出会いやすいエラーを、場面ごとにまとめました。エラーが出たら、まず表示されたメッセージの中の特徴的な言葉(ORA- の番号や英語のキーワード)を、このページで探してみましょう。
B.1 エラーを読むコツ
エラーメッセージは長くて英語ばかりなので、最初は読む気がしないかもしれません。しかし、見るべき場所はだいたい決まっています。
コンソールのエラーは「一番下の Caused by:」を見る
Eclipse のコンソールに赤い文字で長いメッセージが出たら、上から全部読む必要はありません。次の順で探しましょう。
- ERROR と書かれた行を探し、その行の最後の文章を読みます。何が失敗したかの概要が書かれています。
- メッセージを下へスクロールし、一番下にある
Caused by:の行を読みます。これが 本当の原因 であることが多いです。 -
ORA-01017のような ORA- で始まる番号 があれば、それはデータベース(Oracle)からのエラーです。番号でこのページを検索してください。
... ERROR ... Application run failed
org.springframework.beans.factory.BeanCreationException: ...
at ...(たくさんの at 行が続く。ここは読み飛ばしてよい)
...
Caused by: java.sql.SQLException: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
ブラウザのエラーは「status」と「message」を見る
Chrome に Whitelabel Error Page という画面が表示されたら、Spring がエラーを返しています。画面の中の status(ステータスコード)と、その下の説明文を見ましょう。ステータスコードの意味は 第1章 1.2 で説明しています。
画面イメージ:
http://localhost:8080/employeeWhitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
There was an unexpected error (type=Not Found, status=404).
500(サーバー内部のエラー)の場合、ブラウザには詳しいことが表示されません。Eclipse のコンソール にエラーの詳細が出ているので、そちらを確認してください。
英語のエラー文の読み方の例
| よく出る英語 | 意味 |
|---|---|
could not be found / not found
|
見つからない |
required a bean of type ... |
…という型の Bean(Spring が管理する部品)が必要 |
already in use |
すでに使われている |
not supported |
対応していない(使えない) |
cannot be found on object of type ... |
…という型のオブジェクトの中に見つからない |
Failed to convert ... |
…の変換に失敗した(文字を数値にできない、など) |
【便利な使い方】エラーは「どこで」「何が」を探すゲーム
エラーメッセージには、たいてい「どのクラス・どのファイル」で「何が」起きたかが書かれています。クラス名やファイル名、自分で付けた名前(employeeRepository や registerForm など)が出てきたら、そこが手がかりです。
B.2 起動時のエラー
Eclipse でアプリを起動したとき、コンソールに赤い文字のエラーが出て止まってしまう場合です。
データベースに接続できない
| エラー表示 | |
|---|---|
| 原因 | 対処 |
ORA-01017 ユーザー名/パスワードが無効です | |
| ユーザー名かパスワードが違う |
application.properties の spring.datasource.username と password が empapp になっているか確認します。第3章でユーザーを作成したかも確認します(第3章 3.3) |
ORA-12514 リスナーは接続記述子でリクエストされたサービスを現在認識していません | |
| サービス名が違う |
spring.datasource.url の最後が /XEPDB1 になっているか確認します(:XE や /XE ではありません) |
ORA-12541 リスナーがありません / IO エラー 接続が拒否されました | |
| Oracle Database が起動していない | Windows のスタートメニューで「サービス」と検索して開き、OracleServiceXE と OracleOraDB21Home1TNSListener の状態が「実行中」か確認します。止まっていたら、右クリック →「開始」を選びます(第2章 2.3) |
ポートが使われている
| エラー表示 | |
|---|---|
| 原因 | 対処 |
Port 8080 was already in use. | |
| アプリを 二重に起動 している(前に起動したアプリが動いたまま) | Eclipse のコンソールの赤い四角(終了)ボタンで、動いているアプリを停止してから起動し直します。 コンソールが複数あるときは、コンソールのツールバーの「コンソールの表示」ボタン(モニターの形のアイコン)で切り替え、古い実行もすべて止めます。 Boot ダッシュボードを使っている場合は、そこからも停止できます。 |
Port 8080 was already in use. (Eclipse のアプリをすべて止めても出る) | |
Eclipse が異常終了したときなどに、前に起動したアプリの Java(javaw.exe)が残っている |
Eclipse を終了してから、Ctrl + Shift + Esc でタスク マネージャーを開き、「詳細」タブで javaw.exe を選んで「タスクの終了」を押します。そのあと Eclipse を起動し直します。SQL Developer など、ほかの Java で動くソフトも止まることがあるので、先に終了しておきます。 |
【ご注意】Eclipse 以外のソフトが 8080 番を使っている場合
Eclipse のアプリを止めても解決しないときは、他のソフトが 8080 番を使っている可能性があります。Windows の「リソース モニター」(スタートメニューで「リソース モニター」と検索)の「ネットワーク」タブ →「リッスン ポート」で、ポート 8080 を使っているプログラムを確認できます。心当たりのあるソフトを終了するか、パソコンの管理者に相談してください。Oracle の 1521 番も同じ方法で確認できます。
部品(Bean)やクラスが見つからない
| エラー表示 | |
|---|---|
| 原因 | 対処 |
Field ... in ... required a bean of type '...' that could not be found. | |
@Autowired で受け取ろうとした部品を、Spring が見つけられない |
受け取る側のクラスに @Component・@Repository などを付け忘れていないか確認します。クラスが com.example.employeeapp パッケージの 下 にあるかも確認します(第5章 5.2) |
Not a managed type: class ... | |
| Entity として認識されていない | Entity クラスに @Entity が付いているか、entity パッケージが com.example.employeeapp の下にあるかを確認します(第6章 6.4) |
No property 'xxx' found for type 'Employee' | |
| Repository のメソッド名と、Entity のフィールド名が合っていない | たとえば findByEmpId なら、Employee に empId というフィールドが必要です。大文字・小文字も含めて確認します(第7章 7.2) |
Failed to load driver class oracle.jdbc.OracleDriver ClassNotFoundException: oracle.jdbc.OracleDriver | |
| Oracle に接続するためのライブラリ(Oracle Driver)がプロジェクトに入っていない | 第4章でプロジェクトを作るときに「Oracle Driver」を選び忘れています。プロジェクトを右クリック → Spring → スターターの追加 で「Oracle Driver」を追加します(第4章 4.1) |
A '@JoinColumn' references a column named 'xxx' but the target entity '...Department' has no property which maps to this column | |
@JoinColumn の referencedColumnName の値が、Department のフィールド名と合っていない |
Employee の @JoinColumn(name = "DEPT_ID", referencedColumnName = "deptId") の deptId が、Department クラスのフィールド名と同じつづりかを確認します(第6章 6.3) |
気にしなくてよいメッセージ
【知識メモ】WARN HHH100123: Low default JDBC fetch size
起動時に黄色っぽい「WARN」でこのメッセージが出ることがありますが、データベースとの通信の調整に関する助言で、アプリの動作には影響しません。「WARN」は警告、「ERROR」は失敗です。ERROR が出ていなければ、起動は成功 しています(第4章 4.4)。
B.3 画面表示時のエラー
アプリは起動したが、Chrome で画面を開いたり、ボタンを押したりしたときに出るエラーです。
| エラー表示 | |
|---|---|
| 原因 | 対処 |
| Chrome に「このサイトにアクセスできません」 (localhost で接続が拒否されました) | |
| Chrome 自身のエラー画面で、アプリに接続できていない。Whitelabel エラー画面とは違い、Spring は返事をしていない | アプリを起動していないか、起動に失敗しています。Eclipse のコンソールに Started EmployeeAppApplication が出ているか確認します。URL のポート番号が 8080 になっているかも確認します(第4章 4.4) |
Whitelabel Error Page status=404(Not Found) | |
| その URL を受け付ける処理がない | ブラウザに入力した URL の打ち間違い(/employee と /employees など)を確認します。Controller の @GetMapping・@PostMapping の URL、テンプレートの th:action・th:href の URL が一致しているか確認します。Controller を追加・変更した後にアプリを再起動したかも確認します。 テンプレートと Controller のどちらの間違いかは、付録D の方法で切り分けられます。 |
status=405(Method Not Allowed) | |
| GET と POST の種類が合っていない |
@PostMapping で受ける処理に、フォームの method="post" を付け忘れていないか確認します(第9章 9.6)。POST で受ける URL(例: /employees/3/delete)を、アドレス欄に直接入力して開くと GET になるため 405 になります。テンプレートと Controller のどちらの間違いかは、付録D の方法で切り分けられます。 |
status=400(Bad Request) | |
| リクエストの値の形が合わない | URL の社員IDの部分(/employees/abc/edit など)が数字になっているか確認します。実際に送られた URL は、付録D の方法で確かめられます。 |
status=500 TemplateInputException Error resolving template | |
| Controller が返したテンプレート名のファイルが見つからない | Controller の return "employee/list"; と、src/main/resources/templates/employee/list.html の場所・ファイル名が一致しているか確認します(第8章 8.8)。この教材の URL は /employees(複数形)ですが、テンプレートのフォルダーは employee(単数形)です。return "employees/list"; と書くと、このエラーになります。エラー表示が Error resolving template [redirect] のときは、return "redirect"; のように、redirect: の後ろの URL が抜けています。 |
status=500 TemplateInputException An error happened during template parsing | |
テンプレートの th: 属性の書き方が間違っていて、Thymeleaf がテンプレートを読めない |
コンソールの Caused by: に、テンプレート名と行・列が出ます。たとえば Could not parse as expression: "@{/employees/register" (template: "employee/list" - line 11, col 24) なら、list.html の 11 行目で } が抜けています。Attribute name cannot be null or empty のときは、th: href のように th: の後ろに空白が入っています。この場合は行番号が出ないので、そのテンプレートの th: をすべて見直します。 |
Property or field 'xxx' cannot be found on object of type '...' | |
テンプレートの ${employee.xxx} に対応するゲッターがない |
${employee.gender} なら getGender() が必要です。テンプレートの名前とゲッター名のつづりを確認します |
Neither BindingResult nor plain target object for bean name 'registerForm' available as request attribute | |
テンプレートの th:object="${registerForm}" に対応するフォームが Model に入っていない |
Controller で model.addAttribute("registerForm", ...) をしているか、@SessionAttributes・@ModelAttribute の名前とテンプレートの名前が一致しているか確認します(第10章 10.10) |
Missing URI template variable 'empId' | |
URL の {empId} に値が渡されていない |
@{/employees/{empId}/delete(empId=${employee.empId})} のように、後ろのかっこで値を渡しているか確認します。@PathVariable を付けた引数の名前(empId)も確認します(第9章 9.6) |
| 表示はされるが、データの部分が空になる | |
| Model に入れた名前と、テンプレートで使う名前が違う | Controller の model.addAttribute("employees", ...) と、テンプレートの ${employees} のつづりを確認します。エラーにならないので気づきにくい間違いです |
| 画面のデザインが崩れる(CSS が効かない) | |
| CSS ファイルの場所か、読み込むパスが違う |
src/main/resources/static/css/app.css にあるか、テンプレートが th:href="@{/css/app.css}" になっているか確認します。Chrome で Ctrl + F5(キャッシュを使わずに再読み込み)も試します |
B.4 データベースのエラー
| エラー表示 | |
|---|---|
| 原因 | 対処 |
ORA-65096 共通ユーザーまたはロール名が無効です | |
| ユーザーを作るときに、アプリ用のデータベース(XEPDB1)ではなく、コンテナ・データベース(XE)に接続している | SQL Developer の接続のプロパティで、「SID」の xe ではなく 「サービス名」の XEPDB1 を指定して接続し直します(第3章 3.3)。SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL; で XEPDB1 と表示されれば正しい接続です |
ORA-02289 順序が存在しません | |
| シーケンスが見つからない | 第3章の CREATE SEQUENCE を実行したかを、SQL Developer の XE_EMPAPP 接続の「順序」で確認します(第3章 3.5)。Entity の @SequenceGenerator の sequenceName のつづりが、SEQ_DEPT・SEQ_EMP と同じかを確認します |
ORA-00942 表またはビューが存在しません | |
| テーブルが見つからない | Entity の @Table(name = "EMPLOYEE") のテーブル名のつづりを確認します。テーブルを empapp 以外のユーザー(system など)で作ってしまっていないか、SQL Developer の XE_EMPAPP 接続の「表」で確認します(第3章 3.5) |
ORA-00904 無効な識別子です | |
| 列名が違う | Entity のフィールド名が、第3章で作ったテーブルの列名と対応しているか(deptId → DEPT_ID)、@JoinColumn(name = "DEPT_ID", referencedColumnName = "deptId") の列名が合っているか確認します |
ORA-01400 NULL は挿入できません | |
| 必須(NOT NULL)の列に値がないまま登録しようとした | 第11・12章の時点では入力チェックがないため、空欄のまま登録するとこのエラーになります。第13・14章で入力チェックを追加すると防げます(第11章 11.6) |
ORA-02292 整合性制約に違反しました - 子レコードがあります | |
| 社員から参照されている部署を削除しようとした | この教材のアプリは部署を削除しないので、通常は出ません。SQL Developer で部署を削除したいときは、先にその部署の社員を削除します |
ORA-02449 外部キーにより参照される一意/主キーが表にあります | |
| 社員テーブルより先に部署テーブルを DROP しようとした | DROP は EMPLOYEE → DEPARTMENT の順に行います(第3章 3.8) |
ORA-00001 一意制約に反しています | |
| 同じ主キーの値を2回登録しようとした | 社員ID・部署IDは自動で採番されるので、この教材では通常は出ません。INSERT 文で ID を自分で指定していないか確認します |
エラーは出ないが、おかしいとき
| 症状 | |
|---|---|
| 原因 | 対処 |
| SQL Developer では見えるのに、アプリの一覧やテストに出てこない(件数が合わない) | |
SQL Developer で COMMIT していない |
SQL Developer のワークシートで COMMIT; を実行します。コミットするまでは、他の接続(アプリ)からはデータが見えません(第3章 3.6) |
| 社員ID が 1, 2, 4 のように飛んでいる | |
| 削除した、または登録に失敗したことがある | エラーではありません。 シーケンスは、一度払い出した番号や失敗で消費した番号を再利用しません。番号を 1 からそろえたいときは、第3章の手順でシーケンスとテーブルを作り直します(第3章 3.8) |
B.5 入力チェック・セッション関連のエラー
入力チェック(第13・14章)
| 症状・エラー表示 | |
|---|---|
| 原因 | 対処 |
@NotBlank などが赤い下線になる(import できない) | |
| 第4章でプロジェクトを作るときに Validation を選び忘れた | プロジェクトを右クリック → Spring → スターターの追加 で「Validation」を追加します(第13章) |
| 空欄のまま「確認」を押しても、エラーにならず確認画面に進んでしまう | |
Controller の引数に @Validated を付け忘れている |
confirm メソッドの引数を @Validated @ModelAttribute RegisterForm registerForm にします |
入力画面に戻らず、Whitelabel エラー画面(status=400)になる | |
BindingResult の位置が違う |
BindingResult は、チェックするフォームの引数の すぐ後ろ に書く決まりです。間に Model などを挟まないでください |
エラーメッセージが {name.notBlank} のように、キーのまま表示される | |
messages.properties にそのキーがない、またはファイルの場所・名前が違う |
src/main/resources/messages.properties にあるか、アノテーションの {...} とファイルのキーのつづりが一致しているか確認します |
| エラーメッセージが文字化けする | |
messages.properties の文字コードが UTF-8 になっていない |
ファイルを右クリック → プロパティー → リソース で「テキスト・ファイルのエンコード」を UTF-8 にし、メッセージを入力し直します(B.6) |
| エラーメッセージが表示されない | |
| テンプレートにエラー表示の行がない、または項目名が違う |
th:if="${#fields.hasErrors('name')}" と th:errors="*{name}" の項目名が、フォームのフィールド名と一致しているか確認します |
セッション(第10〜12章)
| 症状・エラー表示 | |
|---|---|
| 原因 | 対処 |
NotSerializableException(開発中は起きないことが多く、本番の複数サーバー構成などで起きる) | |
セッションに保存するフォームが Serializable になっていない |
public class RegisterForm implements Serializable にします(第10章 10.4) |
URL に ;jsessionid=... が付く | |
| セッションID を URL で扱う設定になっている |
application.properties に server.servlet.session.tracking-modes=cookie を追加します(第10章 10.3) |
| 登録した直後に「戻る」で確認画面に戻り「登録」を押すと、一覧に戻る | |
| 正しい動きです | 登録が終わるとセッションの入力内容は破棄されるため、二重登録を防ぐために一覧に戻しています(第11章 11.5) |
B.6 Eclipse のトラブル
| 症状 | |
|---|---|
| 原因 | 対処 |
| プロジェクトに赤い × 印が付く | |
| ライブラリのダウンロードが途中で止まった、設定が古い など | プロジェクトを右クリック → Maven → プロジェクトの更新 を選び、「OK」を押します(第4章 4.1) |
| クラス名に赤い下線が引かれる(〜に解決できません) | |
| import が足りない | 赤い下線の語の末尾にカーソルを置いて Ctrl + Space を押し、候補から選び直します(import 文が追加されます)。同じ名前のクラスが複数ある場合は、jakarta.persistence・org.springframework などのパッケージ名を見て選びます(第4章) |
| コードを直して保存したのに、動きが変わらない | |
| アプリに変更が反映されていない | コンソールの赤い四角でアプリを停止してから、もう一度起動します。ファイルを保存しただけでは、動いているアプリには反映されません |
| 日本語が文字化けする(画面・メッセージ・ファイル) | |
| ファイルの文字コードが UTF-8 でない | ファイル(またはプロジェクト)を右クリック → プロパティー → リソース で「テキスト・ファイルのエンコード」を「その他:UTF-8」にします。ワークスペース全体の設定は 第2章 2.2 を参照してください |
| Spring スターター・プロジェクトの作成画面でエラーになる・先に進めない | |
| インターネットに接続できない(start.spring.io に接続できない) | インターネットに接続されているか確認します。会社のネットワークでプロキシの設定が必要な場合は、ウィンドウ → 設定 → 一般 → ネットワーク接続 の設定について、ネットワークの管理者に相談してください |
| JUnit のバーが赤くなる | |
| テストが失敗した | JUnit ビューで失敗したテストをクリックすると、下に原因が表示されます。expected: <3> but was: <2> なら「3件のはずが2件だった」という意味です。データの件数(第9章で削除した、COMMIT していない など)を確認します(第7章 7.3) |
| コンソールが見当たらない | |
| ビューを閉じてしまった | ウィンドウ → ビューの表示 → コンソール で開き直します |
B.7 よくある打ち間違い・置き間違い
B.2〜B.6 はエラーの表示から原因を探す表でしたが、ここでは逆に、初めて作るときにやりがちな間違いから、どんな症状になるかをまとめました。エラーにならず、ただ動かないだけの間違いもあります。完成版(付録A)と見比べるときのチェックリストとして使ってください。
アノテーションの付け忘れ
| 間違いの例 | |
|---|---|
| 起きること | 見つけ方・直し方 |
Controller のクラスに @Controller がない | |
| 起動はするが、そのクラスの URL がすべて 404(B.3) | クラス宣言の上の行を見ます。@Controller がないと、Spring はそのクラスを Controller として扱いません |
メソッドに @GetMapping・@PostMapping がない | |
| その URL だけ 404 | メソッド宣言の上の行を見ます |
ファイルの置き場所
| 間違いの例 | |
|---|---|
| 起きること | 見つけ方・直し方 |
Controller を com.example.employeeapp の外のパッケージ(com.example.other など)に作った | |
| 404。エラーは出ない | パッケージ・エクスプローラーで、com.example.employeeapp の下にあるか見ます。Spring は、起動クラスがあるパッケージとその下しか探しません(第5章 5.2) |
HTML を templates の外(static や src/main/java など)に作った | |
Error resolving template(B.3) |
テンプレートは必ず src/main/resources/templates の下に置きます。employee フォルダーの中かどうかも見ます |
list.html という名前の フォルダー を作り、その中に list.html を作った | |
| エラーにならず、画面に「list.html」という文字だけが表示される | パッケージ・エクスプローラーで、アイコンがファイルかフォルダーかを見ます。新規作成のメニューで「フォルダー」と「ファイル」を取り違えると起きます |
名前の中の空白と、つづり
| 間違いの例 | |
|---|---|
| 起きること | 見つけ方・直し方 |
ファイル名に空白が入っている(list .html、 list.html) | |
Error resolving template |
空白は目で見つけにくいので、ファイルを右クリック → 名前変更で、名前をすべて消して入力し直します |
@GetMapping("/employees ") のように、URL の引用符の中に空白が入っている | |
| 404 | 引用符の中を見ます。見つけにくいので、その行を消して打ち直します |
URL とテンプレート名を取り違える:URL は /employees だが、戻り値を "employees/list" と書いた | |
Error resolving template [employees/list] |
この教材では、URL は employees(複数形)、テンプレートのフォルダーは employee(単数形)です。return の値はフォルダー名に合わせます |
return "redirect"; のように、redirect: の後ろの URL がない | |
Error resolving template [redirect] |
redirect: の後ろに、/ から始まる URL を書きます(return "redirect:/employees";) |
return "redirect:employees"; のように、URL の先頭の / がない | |
404。アドレスバーが /employees/3/employees のような、おかしな URL になる |
/ がないと「今の URL からの相対」と解釈されます。redirect:/employees のように / から書きます |
import の間違い
| 間違いの例 | |
|---|---|
| 起きること | 見つけ方・直し方 |
別のパッケージにある Employee や RegisterForm を import していない | |
| Eclipse でクラス名に赤い下線「Employee を型に解決できません」。起動できない | B.6 の手順で import を追加します |
候補を選び間違えて、Model を ch.qos.logback.core.model から import した | |
クラス名の赤い下線は消えるが、model.addAttribute に赤い下線「メソッド addAttribute(...) は型 Model で未定義です」が出る。起動できない |
ファイルの先頭の import 文を見ます。この教材で使うのは org.springframework.ui.Model です。候補が複数出たときは、パッケージ名が org.springframework で始まるものを選びます |
Thymeleaf の書き損じ
| 間違いの例 | |
|---|---|
| 起きること | 見つけ方・直し方 |
th;href=、th:actio=、th:href"@{...}"(= がない) | |
| エラーにならず、ただの属性として無視される。リンクを押しても移動しない、フォームが別の URL に送られる、など | Chrome の「ページのソースを表示」で、th: や th; がそのまま残っていれば、Thymeleaf に処理されていない証拠です。その属性のつづりと = を見直します |
th: href=(th: の後ろに空白) | |
An error happened during template parsing、Attribute name cannot be null or empty(B.3) |
行番号が出ないので、そのテンプレートの th: をすべて見直します |
@{/employees/register のように } が抜けている | |
An error happened during template parsing、Could not parse as expression(B.3) |
コンソールに出るテンプレート名と行・列の位置を見ます |
B.8 それでも解決しないとき
このページに載っていないエラーや、対処しても直らないエラーに出会うこともあります。そのときは、次の順で進めましょう。
-
エラーメッセージの全文をコピーする
コンソールを右クリック →「すべて選択」→「コピー」で、メモ帳などに貼り付けて保存します。一部だけでなく全文を残すのがポイントです。 -
何をしたら起きたかをメモする
「どのファイルを変更したか」「どのボタンを押したか」「その前は動いていたか」を書き出します。直前に変更した箇所が原因であることがほとんどです。 -
完成版と見比べる
この教材の完成版ソースコード(付録A)と、自分のコードを1行ずつ見比べます。つづりの違い、大文字・小文字、かっこやセミコロンの抜けがよくある原因です。 -
エラーメッセージで検索する
ORA-の番号や、英語のエラー文の特徴的な部分で検索すると、同じエラーに出会った人の情報が見つかることがあります。 -
周りの人に聞く
1〜4 をやっても分からなければ、周りの人に相談しましょう。そのとき、次のことを伝えると、相手も原因を見つけやすくなります。
【便利な使い方】質問するときに伝えること
- 何をしようとしていたか(例:第11章の「登録」ボタンを押した)
- 何が起きたか(エラーメッセージの全文、画面の様子)
- 自分で何を試したか(例:URL のつづりは確認した、再起動した)
【便利な使い方】エラーは成長のチャンス
エラーを自分で読んで直した経験は、そのまま実力になります。現場でも、エラーメッセージを落ち着いて読み、原因を絞り込んでいく力はとても大切です。すぐに答えを探す前に、まずメッセージを読んでみましょう。