2013-01-11 42 views
0

好的 - 最近我一直在使用Java過濾器進行一些工作,而且我們經常需要在Web應用程序之間移動時回收代碼;我們可以讓過濾器查看相對位置,以便可以在多個上下文中使用它們,但我們仍然會經歷很多過濾器。所以,我創建了一個超類來幫助代碼生成;我還在超類中添加了runFilter方法作爲抽象方法,以保持它與標準doFilter分離。超類的代碼如下所示:Java doFilter()將NPE作爲超類的一部分投入使用

public void doFilter(ServletRequest req, ServletResponse resp, 
     FilterChain chain) throws IOException, ServletException { 
    try { 
     runFilter(req,resp,chain); 
    } 
    catch (Exception e) { 
     getLogger().error("Error! Exception:",e); 
    } 
} 

現在,這裏的問題:每當擴展上面的代碼過濾器觸發,我得到的錯誤,就像我在上面記錄器設置,但我也從內部獲得日誌信息子類的runFilter表明它正在做它的工作 - 轉發甚至按照它應該的方式工作。我看着我的控制檯,它顯示了子類正在訪問過濾器鏈的行上發生的錯誤。

if (isExcluded(debugURI)) { 
     chain.doFilter(request, response); 
     return; 
    } else if (request.getSession().getAttribute("USER") == null) { 
     getLogger().info("Session with ID " + serialVersionUID + " has timed out. Redirecting to " + getRedirectTarget() + "."); 
     response.sendRedirect(getRedirectTarget()); 
     chain.doFilter(request, response); 
     return; 
    } 
    else { 
     chain.doFilter(request, response); 
     return; 
    } 

是否需要更新(或擴展)FilterChain以便接收runFilter的調用?任何幫助將非常有用。

+2

我很難理解具體的問題。請澄清。在代碼中唯一不正確的是'sendRedirect()'後面的'doFilter()'調用。這是不對的。擺脫那條線。但這似乎不符合對NPE相關問題的模糊描述。請再次澄清。 – BalusC

+1

以及BalusC上面所說的,發佈實際的NPE跟蹤將有助於 – radai

回答

0

我在servlet的工作中很早就偶然發現了這個錯誤;其實問題很簡單。我從超類內部產生了錯誤,因爲每個過濾器實例在基本級別失敗;然而,真正的錯誤是我嘗試在sendRedirect之後調用doFilter方法 - 由於sendRedirect方法終止了鏈,我試圖訪問一個存根。任何重定向都需要在過濾器鏈中處理,因爲sendRedirect會終止它。

相關問題