たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

Day51

■時間

1.0時間

 

■行ったこと

1.DBコンテナについてのググり作業

 

■出来たこと

DIコンテナについて何となくはわかりました。

 

■出来なかったこと

DIコンテナについて簡潔に説明してくださいと言われたら、

依存性の注入、依存性とはもっと具体的に言うとオブジェクトのことで、厳密にはDIとDIコンテナは別です。具体的には.......以下省略。など、何となく仕組みや概念は理解できました。

ただ、メリットやデメリットは何ですか?それを踏まえて、なぜこのシステムで導入した方が良いのかなどの判断までは出来ません。

 

■その他

一旦、DIについてはここまでにします。

Spring BootでWebアプリを作るときに少しずつ理解を深めていきます。

 

Day50

■時間

1.0時間

 

■行ったこと

1.DB導入時についての復習

 

■出来たこと

DB導入時についてや、DIコンテナの理解に努めました。

 

■出来なかったこと

DIコンテナについて簡潔に説明してくださいと言われると難しいです。

再度、整理しようと思います。

 

■その他

出来なかったことに関しては、今週末に取り組みたいです。

Day49

■時間

2.0時間

 

■行ったこと

1.DB導入後のエラーについてのまとめ

 

■出来たこと

DB導入後のエラー2件をそれぞれまとめることができました。

反省点や課題も洗い出すことが出来ました。

 

■出来なかったこと

DB関連の整頓やまとめるところまでは出来ませんでした。

 

■その他

出来なかったことに関しては、今週末に取り組みたいです。

【DBエラー】更新機能を使用するとエラーが発生した件...

【困りごと】

更新ボタンを押下後、エラーが発生してしまいました。

 

【エラー内容】

更新ボタンを押すとJavaScriptが動き、画面遷移せず更新ダイアログが開きます。

そこで変更箇所を再入力、更新ボタンを押すとエラーが発生してしまいます。

変更箇所もパターンを変えたり、変更せずに変更ボタンを押してもエラーが発生します。

その他、機能の削除や登録は問題なく動作しています。

エラーの画面は、Whitelabel Error Page だった記憶があります。

IDEでの実行結果では、SQL構文がなんたらと書いてあったのを最後の最後に見つけました。

⇒大反省です。

 

【エラー時の詳細/原因の仮説】

更新時に関わる部分だということは想像に難くありません。

確認が必要な箇所は以下だと予想し検証しました。

 

■確認箇所

更新時の一連の流れ

タイピングミス

 

【検証結果】

更新時の流れに問題はありませんでした。

タイピングミスはあったものの修正しても上手くいきませんでした。

 

【再度仮説を立てる】

前回のエラー時にSQL付近だったので、SQL文の確認を行いました。

 

【再検証の結果】

更新時のSQL文が間違っていたためでした。

以下コードのdone = ?の末尾に「,」を入れていました。

 

 

 

public int update(HomeController.TaskItem taskItem) {
int number = jdbcTemplate.update(
"UPDATE tasklist SET task = ?, deadline = ?, done = ? WHERE id = ?",
taskItem.task(),
taskItem.deadline(),
taskItem.done(),
taskItem.id());
return number;
}


惰性で「?」の後は、一区切りだと思い込んでいました。

プログラムのような扱いをしていたことと、

SQL文を横文字で展開していたため区切りがわかりにくかった為です。

 

以下のようにSQLのツールで書くようにして、確認してからの方が良いかもしれません。

UPDATE tasklist

SET task = ?, deadline = ?, done = ?

WHERE id = ?;

 

そんなことより、

一番の問題は実行結果のログを焦って読んでいなかったことです。

解決する寸前に、SQL構文がどうたらと書いてありました。

エラーメッセージが大量に表示されても、落ち着ついて読んでみることを意識します。

【DBエラー】DB操作用クラス導入後にエラーが発生した件...

【困りごと】

作成中のタスク管理アプリケーションでDBを接続した後、

最初の画面が完成したので、試しにアクセスしたが画面が表示されない

 

【エラー内容】

ブラウザの画面にWhitelabel Error Pageとの表示

IDEのログはメモするのを忘れてしまったのですが、

BeanCreationException: Error creating bean with name

などがありました。

これは、同じURLに対して、複数のControllerが割り当てられたとのエラーです。
解決策:@RequestMapping/@GetMapping/@PostMappingの値に重複がないか確認する。

上記は問題ありませんでした。

その他、エラーもありましたが鍵となるものはありませんでした。

 

【エラー時の詳細/原因の仮説】

正常な動作の確認ができたのは、

DB導入直前なので、それ以降の可能性が高いと考えました。

そのため、DB導入時から行ったことを洗い出しました。

 

■可能性が高い箇所(確認が必要な箇所)

pom.xmlへの依存関係の追加(DBの依存関係の部分)

pom.xmlへの依存関係の追加(Spring JDBCの依存関係の部分)

application.propertiesへの設定の追加(JDBCドライバやDBアクセスの設定の追加部分)

DB初期化用のスクリプトが実行されているか?

DB操作用のクラスの作成(詳細は以下)

・フィールドとコンストラクタの宣言

・テーブルにタスク情報を追加するaddメソッド

・テーブルのタスク情報を全て取得するfindAllメソッド

Javaのクラスの修正(HomeControllerクラス)

・DB操作用クラスのフィールドとコンストラクタの追加

・addItemメソッドをDBを使用するように操作

・listItemメソッドをDBを使用するように操作

 

【検証結果】

pom.xmlへの依存関係の追加(DBの依存関係の部分)

⇒〇

pom.xmlへの依存関係の追加(Spring JDBCの依存関係の部分)

⇒〇

application.propertiesへの設定の追加(JDBCドライバやDBアクセスの設定の追加部分)

⇒〇

DB初期化用のスクリプトが実行されているか?

⇒×

DB操作用のクラスの作成(詳細は以下)

⇒全て〇

・フィールドとコンストラクタの宣言

・テーブルにタスク情報を追加するaddメソッド

・テーブルのタスク情報を全て取得するfindAllメソッド

Javaのクラスの修正(HomeControllerクラス)

⇒全て〇

・DB操作用クラスのフィールドとコンストラクタの追加

・addItemメソッドをDBを使用するように操作

・listItemメソッドをDBを使用するように操作

 

■NGの箇所

・DB初期化用のスクリプトが実行されているか

上記だけがNGだったので、ここら辺のチェックが必要です。

 

まず、アプリケーション起動時にあらかじめ用意されたSQL文を実行するように設定したのでそちらを確認しました。

しかし、WebでDBコンソールの確認(アクセス)ができませんでした。

ということは、初期起動が出来ていない可能性が高いです。

初期実行SQL文にも問題ありませんでした。

 

しかし、そこでsqlファイルが2つ用意されているのに気付きました。

・data.spl

・schema.sql

 

結論から言うと、data.splが邪魔をしていたのが原因です。

こちらを削除したところ解決しました。

 

ちなみに、data.sqlは何も記載していません。

 

では、なぜ何も記載していないdata.splが存在したのか?

それは、いずれどちらも使うだろうと用意していたためです。

(結局最後まで使用しませんでした)

 

起動時のSQL実行を有効にしている場合は、

data.splまたはschema.sqlという名前のファイルを用意してそこに記述します。

data.splは、レコードの追加などを行うSQL文の記述に使用し

schema.sqlは、テーブル作成などを行うSQL文の記述に使用します。

この2つが初期起動時に競合していたため、エラーとなっていました。

 

 

 

 

 

 

Day48

■時間

3.0時間

 

■行ったこと

1.タスク管理アプリケーションの完成

2.エラーの解決

 

■出来たこと

エラーを解決しながら、タスク管理アプリケーションの完成させることができました。

 

■出来なかったこと

エラーについてやデータベースとの連携をまとめることが出来ませんでした。

 

■その他

今回のエラーについては後日、投稿します。