2012-07-05 3 views
0

chain.doFilter(request, response);이 실행될 때 아래 오류가 발생합니다. 이 오류는 가끔씩 만 발생합니다.서블릿 필터 오류

스택 추적은 다음과 같습니다 :

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); 
} 

이 예외는 다른 곳에서 발생합니다. stacktrace가 불완전하기 때문에 필자는 야생 값을 추측합니다. 여러분은 문자열 값이 "NULL" 인 숫자 필드를 입력하고 그것에 NumberFormatException을 던지고 있습니다. 에 대한 해결책은 문제가 충분히 분명해야합니다. 문자열 값 "NULL"을 입력하지 않거나 숫자 필드 대신 문자열 필드로 만드십시오.

관련 문제