'JSP 에러'에 해당되는 글 2건

  1. 2009.10.05 JSP 구동시 java.lang.VerifyError 발생
  2. 2009.07.30 JSP에서의 에러처리
Resin을 콘솔에서 실행시켜서 사용할때는 같은 문제를 본적이 없었지만,
이클립싀 플러그인으로 이클립스 내에서 구동할 경우 다음과 같은 에러를 출력한다.
[13:56:32.858] java.lang.VerifyError: (class: _jsp/_index__jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Incompatible argument to function
[13:56:32.858] at java.lang.Class.getDeclaredConstructors0(Native Method)
[13:56:32.858] at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
[13:56:32.858] at java.lang.Class.getConstructor0(Unknown Source)
[13:56:32.858] at java.lang.Class.newInstance0(Unknown Source)
[13:56:32.858] at java.lang.Class.newInstance(Unknown Source)
[13:56:32.858] at com.caucho.jsp.JspManager.preload(JspManager.java:302)
[13:56:32.858] at com.caucho.jsp.JspManager.compile(JspManager.java:210)
[13:56:32.858] at com.caucho.jsp.JspManager.createPage(JspManager.java:177)
[13:56:32.858] at com.caucho.jsp.JspManager.createPage(JspManager.java:157)
[13:56:32.858] at com.caucho.jsp.PageManager.getPage(PageManager.java:248)
[13:56:32.858] at com.caucho.jsp.PageManager.getPage(PageManager.java:166)
[13:56:32.858] at com.caucho.jsp.QServlet.getSubPage(QServlet.java:292)
[13:56:32.858] at com.caucho.jsp.QServlet.getPage(QServlet.java:210)
[13:56:32.858] at com.caucho.server.dispatch.PageFilterChain.compilePage(PageFilterChain.java:206)
[13:56:32.858] at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:133)
[13:56:32.858] at com.vine.service.chance.server.EE.DateFilter.doFilter(DateFilter.java:88)
[13:56:32.858] at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
[13:56:32.858] at com.vine.service.chance.server.EE.CustomerFilter.doFilter(CustomerFilter.java:106)
[13:56:32.858] at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
[13:56:32.858] at com.vine.service.chance.server.EE.WapObjectFilter.doFilter(WapObjectFilter.java:53)
[13:56:32.858] at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
[13:56:32.858] at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)
[13:56:32.858] at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
[13:56:32.858] at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:420)
[13:56:32.858] at com.caucho.server.port.TcpConnection.run(TcpConnection.java:514)
[13:56:32.858] at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520)
[13:56:32.858] at com.caucho.util.ThreadPool.run(ThreadPool.java:442)
[13:56:32.858] at java.lang.Thread.run(Unknown Source)
정상적으로 서비스 되던 소스이기 때문에 소스문제는 아니고.
work 디렉토리의 컴파일된 jsp 소스를 모두 지워보기로 했다. 
/WEB-INF/work 의 .java 파일을 모두 삭제한후 다시 페이지를 열었을때는 해당오류는 발생하지 않았다.
하지만 tag 파일과 tld 파일의 로딩에서 다시 
[14:42:49.718] com.caucho.config.LineConfigException: file:/D:/wwwroot/WEB-INF/tld/header.tld:18: java.lang.NoSuchMethodError: javax.servlet.jsp.tagext.TagAttributeInfo.<init>(Ljava/lang/String;ZLjava/lang/String;ZZ)V
위와 같은 오류가 나타나며 정상적으로 페이지를 열수가 없었다.
TLD파일 관련 오류는 컴파일된 jsp파일을 삭제하여도 없어지지 않았다.

직접적인 해결방법은 얻지 못하였지만 비슷한 케이스중 답변이 달린것중에 클래스패스를 의심해보라는 글이 있어서
클러그인 실행 환경을 변경하여 보았다.
User Entries라 하여 프로젝트에 설정한 클래스패스 또는 직접 jar나 zip을 추가할수 있는 부분에서
프로젝트에서 가져온 default classpath를 삭제하였다.
default classpath를 삭제하고 필요한 프로젝트나 Library를 직접 입력하니 
 java.lang.VerifyError 와 java.lang.NoSuchMethodError: javax.servlet.jsp.tagext.TagAttributeInfo.<init> 모두 발생하지 않아다. jsp도 정상적으로 컴파일된다.

이클립스의 플러그인 환경 뿐아니라 WAS를 콘솔에서 실행키시는 환경에서도 발생할수 있다.
이럴때 클래스패스중 중복된것을 제거하는 등 정리하여보자.

유사한 문제의 다른 해결 방법
http://okjsp.pe.kr/seq/26519


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 영겁회귀
웹개발(JSP&Servlet)2009.07.30 14:42
JSP에서 에러처리를 처리하는 방법중 가장 간편한 방법은

1. page 지시자를 통해서 에러를 처리하는 페이지를 지정하는 방법이다.
page 지시자의 errorPage 속성을 통해서 에러를 처리할 페이지의 경로를 적는 방법이다.
<%@page errorPage="common/error.jsp"%>
페이지에서 컴파일 오류가 발생하거나 Exception이 발생하게 된다면 
common디렉토리의 error.jsp로 제어권이 넘어가 에러 관련 처리를 하고 페이지를 종료하게 된다.

error.jsp에서는 자신이 에러를 처리하기 위한 페이지임을 나타내야 하는데.
page 지시자의 isErrorPage속성을 "true"로 지정하면 에러처리페이지임을 나타낸다.
<%@page isErrorPage="true"%>

<%@page contentType="text/html" pageEncoding="EUC-KR"%>

<%@page isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
        <title>Error Handle JSP Page</title>
    </head>
    <body>
        <h1>에러를 처리하겠습니다 멉니까.</h1>
<%
   out.print( exception.getMessage() );
   out.print( "<BR>" );
   out.print( exception.toString() );
   out.print( "<BR>" );
   out.print( "<BR>" );
%>

</body></html>
에러 페이지에서 관련에러는 exception이라는 내장 객체를 통해서 정보를 얻을수 있다.

2. 배치기술서(Deploy Descriptor(DD), web.xml)를 사용하여 에러처리 페이지를 지정해 놓는다
DD에 에러의 종류와 그 에러를 처리할 수 있다.
첫번째 방법은 페이지가 응답하는 HTTP 오류 상태코드 별로 에러 처리 페이지를 지정하는 방법이고,
Client가 WAS에 요청을 하게되면 성공이든 실패이든 결과를 리턴하게 된다. 그 응답의 성공/실패와 그 종류를 
알수 있는 것이 HTTP 응답코드이다. 

가령 많이 만나게 되는 오류인 NullPointerException이 발생했을 경우 페이지의 응답은 실패가 되고
그 응답의 종류는 Internal Server Error라고 하여 HTTP응답 코드가 500이 된다.
이런 특정한 응답 코드에 대한 처리 페이지를 지정하고 싶다면 DD에 지정해 놓으면 된다.
<error-page>
<error-code>500</error-code>
<location>/error.do</location>
</error-page>
응답코드가 500일때는 /error.do 페이지에서 에러를 처리한다는 선언이다.

두번째 방법은 페이지에서 발생하는 Exception의 종류 별로 에러 처리 페이지를 지정하는 방법이다.
처리할 Exception과 처리할 페이지를 명시적으로 선언하여, Exception 발생시 지정 페이지에서 처리하는 방법이다.
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/nullpointer.do</location>
</error-page>
응답중 NullPointerException이 발생하면 /nullpinter.do 페이지에서 예외처리를 한다는 의미이다.
DD를 통하여 선언적으로 에러 종류와 처리 페이지를 지정해 놓으면 
page지시자에 설정된 에러페이지에서 에러를 처리하는 것보다. 보다 자세하고 명시적으로 에러처리를 할수 있다는 장점이 있다. 

두가지 선언중 우선권을 가지게 되는 에러처리 선언은 <exception-type>이다.  
가령 NullPointerException이 발생하여 500 응답을 하게 되었는데,
<error-page>
<error-code>500</error-code>
<location>/error.do</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/nullpointer.do</location>
</error-page>

500과 NullPointerException의 에러 처리 페이지중 에러가 처리되는 페이지는 exception-type으로 선언한 /nullpointer.do이다. 



저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 영겁회귀

티스토리 툴바