2010-01-15 5 views
2

현재 JBoss J2EE 컨테이너에서 Sun의 Glassfish J2EE 컨테이너로 Spring 응용 프로그램을 마이그레이션 중이며 동일한 코드이지만 응용 프로그램의 특정 지점에서 혼란스러운 오류가 발생합니다. 이 오류는 컨트롤러가 리디렉션 키워드를 사용하여 스프링 웹 흐름에 의해 처리 된 페이지로 리디렉션 할 때마다 발생합니다. 나는 단순히 테스트 텍스트가되도록 렌더링되어야하는 jsp를 편집했다. 따라서 JSP 컴파일에서 내 오류가 발생한다고 상상할 수 없다. 내 서버 로그에서 가져온 스택 추적을 아래에 게시했습니다. 스택 트레이스에 내 자신의 클래스가 전혀 없다는 사실로 인해 나는 어떤 다른 정보가 유용할지 모르겠습니다. 나는 보스에서 모두이 오류가 발생하지 않는 것을 언급해야글래스 피 JSP null 포인터 예외

그것은 오류가 발생 exception_jsp.java 파일에 다음 호출에서 오는 나타납니다
[#|2010-01-15T14:59:06.334-0500|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-3;_RequestID=ee69c2b0-30df-437f-ab22-fd8777dbf826;|StandardWrapperValve[burq]: PWC1406: Servlet.service() for servlet burq threw exception 
java.lang.NullPointerException 
    at org.apache.jsp.WEB_002dINF.jsp.exception_jsp._jspService(exception_jsp.java:33) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.sun.identity.agents.filter.AmAgentBaseFilter.allowRequestToContinue(AmAgentBaseFilter.java:126) 
    at com.sun.identity.agents.filter.AmAgentBaseFilter.doFilter(AmAgentBaseFilter.java:75) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:873) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:723) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:558) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:490) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:382) 
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:240) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:252) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1173) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.sun.identity.agents.filter.AmAgentBaseFilter.allowRequestToContinue(AmAgentBaseFilter.java:126) 
    at com.sun.identity.agents.filter.AmAgentBaseFilter.doFilter(AmAgentBaseFilter.java:75) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313) 
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 
|#] 

: 여기

response.setStatus(((Integer)request.getAttribute("javax.servlet.error.status_code")).intValue()); 

가 가득 널 포인터를 일으키는 exception_jsp.java 파일 :

package org.apache.jsp.WEB_002dINF.jsp; 

import javax.servlet.*; 
import javax.servlet.http.*; 
import javax.servlet.jsp.*; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.mail.Transport; 
import java.util.Properties; 
import org.apache.commons.lang.exception.ExceptionUtils; 

public final class exception_jsp extends org.apache.jasper.runtime.HttpJspBase 
    implements org.apache.jasper.runtime.JspSourceDependent { 

    private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); 

    private static java.util.Vector _jspx_dependants; 

    private org.apache.jasper.runtime.ResourceInjector _jspx_resourceInjector; 

    public Object getDependants() { 
    return _jspx_dependants; 
    } 

    public void _jspService(HttpServletRequest request, HttpServletResponse response) 
     throws java.io.IOException, ServletException { 

    PageContext pageContext = null; 
    HttpSession session = null; 
    Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request); 
    response.setStatus(((Integer)request.getAttribute("javax.servlet.error.status_code")).intValue()); 
    ServletContext application = null; 
    ServletConfig config = null; 
    JspWriter out = null; 
    Object page = this; 
    JspWriter _jspx_out = null; 
    PageContext _jspx_page_context = null; 

    try { 
     response.setContentType("text/html"); 
     response.setHeader("X-Powered-By", "JSP/2.1"); 
     pageContext = _jspxFactory.getPageContext(this, request, response, 
       null, true, 8192, true); 
     _jspx_page_context = pageContext; 
     application = pageContext.getServletContext(); 
     config = pageContext.getServletConfig(); 
     session = pageContext.getSession(); 
     out = pageContext.getOut(); 
     _jspx_out = out; 
     _jspx_resourceInjector = (org.apache.jasper.runtime.ResourceInjector) application.getAttribute("com.sun.appserv.jsp.resource.injector"); 

     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("<html lang=\"en\">\r\n"); 
     out.write("\r\n"); 
     out.write("\t<head>\r\n"); 
     out.write("\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"/j2ee/shared/css/common.css\" />\r\n"); 
     out.write("\t\t<script type=\"text/javascript\" language=\"javascript\" src=\"/j2ee/shared/js/base.js\"></script>\r\n"); 
     out.write("\t</head>\t\t\r\n"); 
     out.write("\t\r\n"); 
     out.write("\t<body>\r\n"); 
     out.write("\t\t<h1 title=\"BSS Update Retrieval and Query System 1.0.0\">BSS Update Retrieval and Query System</h1>\r\n"); 
     out.write("\t\t\t\r\n"); 
     out.write("\t  "); 

      try { 
      Throwable ex = exception; 
      if(ex == null){ 
       ex = ((Exception) request.getAttribute("exception")); 
      } 
      out.println("<p class='exception'>"); 
      out.println("An error occured while running the BSS Update Request and Query system:- " + "<br/>"); 
      out.println(ex.getMessage() + "<br/>"); 
      out.println("Please contact " +"<a href='mailto:[email protected]'>Sequencing Support</a>" + " for help."); 
      out.println("</p>"); 

      out.println("<br><div style='display:none'>" + ExceptionUtils.getFullStackTrace(ex) + "</div><br/>"); 
      Message message = new MimeMessage(Session.getInstance(new Properties())); 
      message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected],[email protected]")); 
      message.addFrom(InternetAddress.parse("[email protected]")); 
      message.setSubject("Error - BSS Update Request and Query system"); 
      StringBuffer content = new StringBuffer(); 
      content.append("An exception occured while running the BSS Update Request and Query system: " + "\n"); 
      content.append(ExceptionUtils.getFullStackTrace(ex)); 
      message.setText(content.toString()); 
      Transport.send(message); 
      } 
      catch(Exception e){ 
       out.println(e.getMessage()); 
      } 

     out.write("\r\n"); 
     out.write("\t</body>\t\t\t\t\r\n"); 
     out.write("</html>\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
     out.write("\r\n"); 
    } catch (Throwable t) { 
     if (!(t instanceof SkipPageException)){ 
     out = _jspx_out; 
     if (out != null && out.getBufferSize() != 0) 
      out.clearBuffer(); 
     if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); 
     } 
    } finally { 
     _jspxFactory.releasePageContext(_jspx_page_context); 
    } 
    } 
} 
+1

로그 레벨을 debug로 설정하여 봄용 로깅을 높이는 것이 도움이 될 수 있습니다. 때로는 봄 로깅이 문제의 원인을 알려주는 데 매우 도움이 될 수 있습니다. 아마 이상한 설정 문제 일 것입니다 ... 바람둥이와 부두에서 이동했을 때 비슷한 것을 보았습니다. – cjstehno

+1

exception.jsp 코드 – Bozho

+2

응용 프로그램 서버의 작업 디렉토리에서 JSP 페이지의 생성 된 .java 소스 ("/WEB-INF/jsp/exception_jsp.java")를 확인하는 것이 유용 할 수도 있습니다. – axtavt

답변

4

라인 :

response.setStatus(((Integer)request.getAttribute("javax.servlet.error.status_code")).intValue()); 

하면 자동으로 생성됩니다 모든 JSP에 대한 JSP 컴파일러 :

<%@page isErrorPage="true"%> 

여기에서 알 수없는 이유로 요청 속성은 리디렉션 중에 설정되거나 손실되지 않으므로 <%@page isErrorPage="true"%>을 사용하면 NPE가됩니다. 이것은 코드, GlassFish 또는 Sping (또는 전혀)의 버그 일 수 있지만 코드에서 페이지 흐름에 대한 세부 정보 없이는 말할 수 없습니다.

this thread에 대한 토론이 있습니다 (비슷하지만 동일하지는 않으며 근본 원인은 동일한 IMO가 아닙니다). 이 봄에, 글래스 피쉬 버그의 경우 내가 말할 수 없다,

${pageContext.errorData.throwable} 
${pageContext.errorData.statusCode} 
${pageContext.errorData.requestURI} 
${pageContext.errorData.servletName} 

내가 말했듯이 : 제안 된 해결 방법은 isErrorPage 지시어를 사용하지 않도록하고 오류 정보에 액세스하려면 다음 EL 코드를 사용하는 것입니다 또는 전혀 버그가 아닙니다. 그러나 어쨌든 GlassFish 이슈 트래킹 시스템에서 ticket을 열 수 있습니다.보다 정확한 대답을 얻을 수 있습니다 (그리고 커뮤니티를 도우십시오).

+0

기술적으로 이것은 내 문제의 "대답"이 아니지만,이 대답은 내 문제를 해결하는 방법을 더 잘 이해할 수있는 배경을 제공합니다. 내 로깅을 '디버그'로 바꾸려는 위의 아이디어와 함께 자바 코드에서이 문제를 일으키는 버그를 찾았습니다. – TimmyJ

2
response.setStatus(((Integer)request.getAttribute("javax.servlet.error.status_code")).intValue()); 

이 줄이 문제를 일으키는. 그것을 주석과 오류가 있었는지

그것은 아마도 null

javax.servlet.error.status_code에만 설정됩니다 (주조없이 또는 intValue()) request.getAttribute("javax.servlet.error.status_code")의 값을 출력하려고합니다. 따라서 오류 페이지로 사용하지 않고 exception.jsp으로 리디렉션하는 경우 상태 코드가 설정되지 않으므로 NullPointerException

+0

왜 당신이 그것을 downvote 만들었어요? 나는 무엇을 놓치거나 쓴 것이 잘못 되었습니까? – Bozho

+0

그게 맞는 동안, 그는 행의이 부분이 null을 리턴하는 것이 아니라 스택 추적에 의해서만 행을 식별했습니다. 그리고 NPE가 항상 잘 이해되지는 못한다는 것을 알고 계실 것입니다. – Bozho

1

페이지가 오류 페이지로 설정되어 있습니까?

<web-app> 
<!-- ..... --> 
<error-page> 
    <error-code> 
     404 
    </error-code> 
    <location> 
     /404.html 
    </location> 
</error-page> 
<error-page> 
    <exception-type> 
     javax.servlet.ServletException 
    </exception-type> 
    <location> 
     /servlet/ErrorDisplay 
    </location> 
</error-page> 
<!-- ..... --> 

는 다음과 같은 세 가지 특성받을 수있는 규칙의에서 서블릿 : 글래스 피쉬와

* javax.servlet.error.status_code : An Integer telling the error status code, if any 
* javax.servlet.error.exception_type : A Class instance indicating the type of exception that caused the error, if any 
* javax.servlet.error.message : A String telling the exception message, passed to the exception constructor 
관련 문제