学習56日目:メンタリング5回目(リアクション機能追加完了)。

今日の学習時間。

  • Day:56
  • Today:6h
  • Total:340h

学習内容について。

  • アプリ制作
    • リアクション機能の追加
    • キタミ式基本情報技術者

簡易的なリアクション機能追加。

「いいね」ボタンを押すと加算されていくタイプのリアクション機能を実装してみました。途中、色々な困難がありましたが、上手く行った時はとても気持ちが良かったです。下のコミットはメンタリング後の修正を加えたものになります。簡単に引っかかったエラー箇所だけまとめてみます。

エラー①: id to load is required for loading

実現したいこと
  1. いいねボタンを押すことでいいね数をデータベースに加算
  2. トップページへリダイレクト
  3. フラッシュメッセージの表示
何をしたか

RESTアーキテクチャのupdateを参考にコードを書く。

エラーの内容
  • いいねボタンを押すと「HTTPステータス 500」のエラーが表示される
    •  id to load is required for loading
解決のために何を調べた(試した)か
  • どのコードが間違えているのかを確認するために一文ずつコメントアウト
    • リダイレクトとフラッシュメッセージは問題なく稼働
  • 45行目の「セッションスコープからレポートのIDを取得して該当のIDのレポート1件のみをデータベースから取得」するコードに問題があると考えた
    • 引数の文字列を書き換えたりしたが変化なし

結論から言うと、このコードはセッションにreport_idというキーで値が入っている前提ですが、それがセットされていなかったことが原因でした。findメソッドは対象のDTOの@Idとアノテーションを付けたプロパティを条件として、引数に渡された値を元に検索をかけています。必須項目の@Idがうまく渡っていなかった訳です。セッションが入っているかを確かめるためにあえてセッションをSystem.out.println()させると分かりやすいかもしれません。

コンソールを見ると、セッション中のreport_id:nullと表示されました。なので、あとは遷移前の画面にセットすれば解決です。

ReportShowServlet.javaの44行目にgetIdreport_idという名前でセッションに渡してあげます。すると、いいねボタンを押した際にきちんとreport_idの番号が表示されます(コンソール)。確実にセッションの流れを把握することが重要です。

しかし、今度は下記のようなエラーが代わりに表示されるようになったので、それを解決していきます。

エラー②:For input string: “”

実現したいこと

いいねボタンを押すことでいいね数をデータベースに加算(先ほどと同じです)。

何をしたか

パラメータをInteger型に変換してからsetLikesにセット

エラーの内容
  • いいねボタンを押すと「HTTPステータス 500」のエラーが表示される
    • For input string: ""
解決のために何を調べた(試した)か
  • どのコードが間違えているのかを確認するために一文ずつコメントアウト
  • エラー文を読んでInteger型なのにStringの文字列が入力されていることが原因だと考えた
    • キャストしてみたりした
  • もしかしたら、正しくsubmitされていないのかもしれない

StringIntegerにしようとしているので、文字列が入っていること自体は「正しい」動きではあります。しかし、エラー文を見るとFor input string: ""、つまり、数字にしようとしたけど、その対象が空っぽだからできませんよと言われている状態です。なので、単純な話ですが、jspできちんと値が送信されていなかったということですね。

<button type="submit" name="likes" value="${1}">いいね!</button>

このようにvalueを指定してあげることでサーブレットへと値が送られます。

メンタリングについて。

今日で早くも5回目のメンタリングがありました。まずは追加した機能を画面共有で説明。表で抜けていた箇所がありましたが、それ以外は上手くいったようです。追加したコードは既にGithubにプッシュしました。

一応、メンターがお客さんとの二役を演じている訳ですが、早速機能追加の要望が出ました。

 機能追加について
  • リアクション機能の拡張
  • いいね数の数字をリンクにする
  • それをクリックすると、「いいねした人一覧」みたいな画面へと遷移
  • そこには「いいねした人の名前」と「いいねした日時」を記録

この機能を実装するにあたり、前回と同様に画面設計書とテーブル定義書を用意しなければなりません。それに加え、今回新たに修正一覧なるものも用意します。修正一覧とはこれから修正するファイルや追加するファイルをあらかじめ書き出しておくことです。そのボリュームによって実際の仕事では時間や人員の管理もしたりするそうですよ。

また、テーブルは新規に作成する予定です。前回、いいね数をレポートのテーブルに追加しましたが、それはそのまま使用します。実際の現場でも機能拡張の際はテーブルの項目は削除しないのが普通らしいです。まあ、それはそうですよね。それらのテーブルを同期、つまり、新たにいいねされたら2つのテーブル同士のカラムが増えていくということになります。

今日の反省と明日の目標。

今までなあなあで進めていた部分のツケを払うことになってしまいましたが、エラーと格闘して試行錯誤するのも学習のフェーズとしては悪くないかなと自分を納得させています。これが、独学だと途中で折れてしまうことも十分あり得たと思います。しかし、面と向かってメンターに出来ませんでしたとは言いたくないから必然的に勉強に身が入るという訳です。まあ、実際の仕事では出来ないことでもするのが当たり前だから、それに慣れておかないといけませんね。後、エラーを解決する上で大事だと思ったことは一歩引いて考えるということです。パソコンから離れて紙か何かに処理の流れを整理するとパッと閃くことがあります。悩んで悩んで眠くなって次の日起きたら簡単に解けたということもあるので、脳内の主記憶装置を開放してあげるという選択肢も最終手段としていいかもしれません。明日は今日のメンタリングで出た設計書類の作成に取り掛かろうかと思います。

閉じる