前提・実現したいこと
OncePerRequestFilterを継承したfilterクラスを作成し
リクエストのURLが特定のURLの場合に例外を発生させる処理を
実装しています。
特定のURL文字列はList型のクラス変数に設定し、
このクラス変数は宣言と同時に初期化しています。
Listの要素の設定は「コンテキストパス+固定の文字列」で、
固定文字列を含む文字列を設定しています。
コード上はクラス変数list自体もその要素自体も
nullが設定されることはないと考えていますが
javaのコード自体や、springFwの不具合等の観点でも
nullが設定される可能性はないか、情報がありましたら
ご教授いただけますか。
発生している問題・エラーメッセージ
コード上はlistにnullの要素が設定されることはないと思いますが
CheckUrl.isOkメソッドのs.equalsでNullPointerExceptionが発生します。
現在、本番稼働中、発生頻度は極小(数年前に1回発生)
(※下記ログの内容は一部変更しています、ご容赦ください)
<2019/mm/dd hh時mm分ss秒 JST> <Error> <HTTP> <BEA-101020> <[ServletContext@9999999999[app: module: path:null spec-version:3.0]] Servlet failed with an Exception java.lang.NullPointerException at jp.co.test.presentation.com.filter.CheckUrl.isOk(CheckUrl.java:99) at jp.co.test.presentation.com.filter.CheckUrlFilter.doFilterInternal(CheckUrlFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) Truncated. see log file for complete stacktrace
該当のソースコード
Java
1 2public final class CheckUrl { 3 4 private CheckUrl() {} 5 6 protected static boolean isOk(String path, List<String> list) { 7 for (String s : list) { 8 if (s.equals(path)) { // ←ここでNullPointerException発生 9 return true; 10 } 11 } 12 return false; 13 } 14 15}
Java
1@Profile({"development","it","production"}) 2@Component("checkUrlFilter") 3public class CheckUrlFilter extends OncePerRequestFilter { 4 5 private static final String REDIRECT_URL = "/jsp/test/test/Error.jsp"; 6 7 private List<String> requestUrl = new ArrayList<>(); 8 9 public CheckUrlFilter() { 10 } 11 12 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { 13 14 String curPath = request.getServletPath(); 15 addRequestUrl(request); 16 if (!CheckUrl.isOk(curPath, requestUrl)) { // ←CheckUrl.isOkを呼出し 17 // ここで意図した例外をスロー 18 } 19 chain.doFilter(request, response); 20 } 21 22 private void addRequestUrl(HttpServletRequest request) { 23 requestUrl.add(request.getContextPath() + REDIRECT_URL); 24 } // ↑リクエストごとに同じ文字列が設定されている実装は微妙だが、 25 // ここでnullが設定されるとは考えにくい 26} 27
試したこと(再現性の検証)
①requestUrlへ追加する要素を1リクエストごとに1万回設定し画面を任意に操作
→再現ぜず、100万回にするとOutOfMemory発生(NullPointerException発生せず)
②原因不明ではあるが、念のため同時アクセス(複数名で同時に画面操作)を実施
→再現せず
試したこと(「null + 固定文字列」の結果)
system.out.println(null + "/jsp/test/test/Error.jsp");
→"null/jsp/test/test/Error.jsp"で出力されたため、
やはりnullの要素がlistに設定されることはない、と考えています。
補足情報(FW/ツールのバージョンなど)
springFwは4.0.5(aop,beans,context,core,expression,jdbc,tx,web,webmvc)
java 1.7、weblogic 12.1.3
回答3件
あなたの回答
tips
プレビュー