2012-07-05 75 views
0

执行chain.doFilter(request, response);时出现错误。这个错误有时只会发生。Servlet过滤器中的错误

堆栈跟踪低于::

enter code here 

<i>javax.servlet.ServletException: For input string: "NULL" 
    at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:516) 
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:423) 
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) 
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) 
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) 
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:835) 
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:341) 
    at com.evermind.server.http.ServletRequestDispatcher.forward(ServletRequestDispatcher.java:261) 
    at com.evermind.server.http.GetParametersRequestDispatcher.forward(GetParametersRequestDispatcher.java:257) 
    at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056) 
    at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388) 
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231) 
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) 
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) 
    at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65) 
    at my.SampleFilter.doFilter(SampleFilter.java:120) 
    at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:16) 
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) 
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:670) 
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:341) 
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:816) 
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:231) 
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:136) 
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186) 
    at java.lang.Thread.run(Thread.java:534)</i> 

我的滤波代码为如下::

<i>public class SampleFilter 
implements Filter 
{ 

private transient FilterConfig filterConfig; 
Context initialContext; 

public SampleFilter() 
{ 
    filterConfig = null; 
    initialContext = null; 
} 

public void destroy() 
{ 
} 



public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    throws ServletException, IOException 
{ 



    Connection conn=getJNDIConnection(); 

    request.setAttribute("CONNECTION", conn); 
    try 
    { 
     System.out.println("Filter start GOOG Website"); 
     chain.doFilter(request, response); 
    } 
    catch(Exception e) 
    { 
     //System.out.println("@@@@@@@@@@@@@@@@@@@@@ Exception occured in doFilter @@@@@@@@@@@@@@@"); 
     closeConnection(initialContext, conn); 
     System.out.println("@@@@@@@@@@@@@@@@@@@@@ Connection Closed @@@@@@@@@@@@@@@"); 

     String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e); 



     e.printStackTrace(); 
    } 
    closeConnection(initialContext, conn); 
    System.out.println("Filter end "); 
} 

Connection getJNDIConnection() 
{ 
    Connection conn = null; 
    try 
    { 
     initialContext = new InitialContext(); 
     if(initialContext == null) 
     { 
      System.out.println("JNDI problem. Cannot get InitialContext."); 
     } 
     DataSource datasource = (DataSource)initialContext.lookup("jdbc/MY_DS"); 
     if(datasource != null) 
     { 
      conn = datasource.getConnection(); 
     } else 
     { 
      System.out.println("Failed to lookup datasource."); 
     } 
    } 
    catch(NamingException ex) 
    { 
     System.out.println("Cannot get connection: " + ex); 
    } 
    catch(SQLException ex) 
    { 
     System.out.println("Cannot get connection: " + ex); 
    } 
    return conn; 
} 



void closeConnection(Context ctx, Connection conn) { 
    try { 
     if (ctx != null) { 
      ctx.close(); 
      ctx = null; 
     } 

     if (conn != null && !conn.isClosed()) { 
      conn.close(); 
      conn = null; 
     } 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SQLException sqe) { 
     sqe.printStackTrace(); 
    } finally { 
     conn = null; 
    } 
} 

public void init(FilterConfig filterConfig) 
    throws ServletException 
{ 
    this.filterConfig = filterConfig; 
} 
} 
</i> 

我的web.xml中含量低于::

<i><?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <servlet> 
    <servlet-name>action</servlet-name> 
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
    <init-param> 
     <param-name>config</param-name> 
     <param-value>/WEB-INF/struts-config.xml</param-value> 
    </init-param> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>3</param-value> 
    </init-param> 
    <init-param> 
     <param-name>detail</param-name> 
     <param-value>3</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>action</servlet-name> 
    <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 



    <filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 


    <filter> 
     <filter-name>SampleFilter</filter-name> 
     <filter-class> my.SampleFilter 
     </filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>SampleFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <session-config> 
     <session-timeout>720</session-timeout> 
    </session-config> 

</web-app> 
</i> 

感谢

回答

0

还有一些mi深入了解这里。

javax.servlet.ServletException: For input string: "NULL" 
    at org.apache.struts.action.RequestProcessor.processException 

此异常不是由你的过滤器造成的,但它造成的和其他地方抛出的,并且永远不会被抓住,直到你的过滤器的try-catch块,你会以不正确的方式处理异常。你应该赶上只有那些你可以合理处理的例外。由于显然没有任何一个例外,你可以合理处理,你应该让这些例外通过完全删除整个catch区块并将其替换为finally

Connection conn = getJNDIConnection(); 
request.setAttribute("CONNECTION", conn); 

try { 
    chain.doFilter(request, response); 
} finally { 
    closeConnection(initialContext, conn); 
} 

回到特殊的例外情况,如上所述,这是其他地方引起的。由于堆栈跟踪不完整,我会做一个疯狂的猜测:你在某个地方输入一个字符串值为"NULL"的数字字段,并在其上输入NumberFormatException。对于问题的解决方案应该足够明显:要么不输入字符串值"NULL",要么将其设为字符串字段而不是数字字段。