回答編集履歴

2

追記2:DAOサンプルのリンクを掲載

2015/11/10 12:36

投稿

argius
argius

スコア9388

test CHANGED
@@ -95,3 +95,19 @@
95
95
  ```
96
96
 
97
97
 
98
+
99
+ ---
100
+
101
+
102
+
103
+ (追記2)
104
+
105
+
106
+
107
+ 上記の1について、実装例を書きましたのでリンクを載せておきます。
108
+
109
+
110
+
111
+ Java8版 簡易DAOサンプル (Gist)
112
+
113
+ [https://gist.github.com/argius/e71722f5cad6f79227fc](https://gist.github.com/argius/e71722f5cad6f79227fc)

1

防止策について追記

2015/11/10 12:36

投稿

argius
argius

スコア9388

test CHANGED
@@ -5,3 +5,93 @@
5
5
  サーブレットで、`request.setAttribute("cdList")`を正しく行っているかどうかを確認してみてください。
6
6
 
7
7
  行っていても、if文などの分岐でそこを通らない可能性などがあれば、それも確認してください。
8
+
9
+
10
+
11
+ ---
12
+
13
+
14
+
15
+ (追記)
16
+
17
+
18
+
19
+ 回答ではありませんが、このようなケースは良くあることなので、防止策について書かせていただきます。
20
+
21
+
22
+
23
+
24
+
25
+ JSP側で`NullPointerException`が発生すると追っかけにくくなりますので、下記のようにしてサーブレット側で防ぐようにします。
26
+
27
+
28
+
29
+
30
+
31
+ 1.DAOのselectメソッドが`null`を返さないようにする
32
+
33
+
34
+
35
+ DAOに限りませんが、戻り値が`null`になるようなメソッドはできるだけ書かないようにしましょう。
36
+
37
+
38
+
39
+ どのようなケースで`null`を返しているかにもよりますが、SELECTに失敗していれば例外をスローする、検索結果無しの場合は、戻り値が`List<Item>`なら、`Collections.emptyList()`を返すようにします。
40
+
41
+
42
+
43
+
44
+
45
+ 2.分岐によってセットし忘れがないようにする
46
+
47
+
48
+
49
+ if文などで、ifの方には書いたけどelseのところで`setAttribute`を忘れてしまうようなケースがあります。
50
+
51
+
52
+
53
+ `setAttribute`は分岐の中に書かないようにして、かつ`list`が`null`でないことを保証するとなお良いです。
54
+
55
+
56
+
57
+ 例:
58
+
59
+
60
+
61
+ ```lang-java
62
+
63
+
64
+
65
+ List<CDItem> list;
66
+
67
+ if ( ... ) {
68
+
69
+ list = dao.findById(id);
70
+
71
+ }
72
+
73
+ else {
74
+
75
+ list = dao.findAll();
76
+
77
+ }
78
+
79
+
80
+
81
+ if (list == null) {
82
+
83
+ throw new ServletException(); // システムエラー
84
+
85
+ }
86
+
87
+
88
+
89
+ // listがnullでないことが保証される
90
+
91
+ request.setAttribute("cdList", list);
92
+
93
+
94
+
95
+ ```
96
+
97
+