2011-12-23 28 views
29

Tôi có một vấn đề với egovframework của Hàn Quốc khi tôi đã triển khai chiến tranh tập tin để Tomcat sau khi tôi khởi động lại Tomcat, nó cho thấy các lỗi như dưới đây:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath() Ljava/lang/String;

2011-12-23 09:16:01,101 ERROR [org.springframework.web.servlet.DispatcherServlet] Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'imageRenderer' defined in ServletContext resource [/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String; 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
     at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) 
     at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) 
     at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) 
     at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) 
     at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) 
     at javax.servlet.GenericServlet.init(GenericServlet.java:212) 
     at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139) 
     at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:791) 
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:660) 
     at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469) 
     at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403) 
.................................................... 

tôi đã sử dụng:

[[email protected] bin]# java -version 

java version "1.6.0_20" 
OpenJDK Runtime Environment (IcedTea6 1.9.10) (rhel-1.23.1.9.10.el5_7-i386) 
OpenJDK Client VM (build 19.0-b09, mixed mode) 

Đây là tập tin WEB-INF/web.xml

<display-name>spring security</display-name> 
    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>utf-8</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>*.do</url-pattern> 
    </filter-mapping> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>*.mdo</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>HTMLTagFilter</filter-name> 
     <filter-class>egovframework.com.cmm.filter.HTMLTagFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>HTMLTagFilter</filter-name> 
     <url-pattern>*.do</url-pattern> 
    </filter-mapping> 

     <!-- 0. 로그인 정책 컴포넌트용 필터 --> 
     <!-- 
    <filter> 
     <filter-name>LoginPolicyFilter</filter-name> 
     <filter-class>egovframework.com.uat.uap.filter.EgovLoginPolicyFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>LoginPolicyFilter</filter-name> 
     <url-pattern>/uat/uia/actionLogin.do</url-pattern> 
    </filter-mapping> 
    --> 
     <!-- Restoration from HTMLTagFilter's action (certification login) --> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:egovframework/spring/com/context-*.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>action</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/config/egovframework/springmvc/egov-com-*.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>action</servlet-name> 
     <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

     <!-- 1. Spring Security 필터 설정--> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <listener> 
     <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class> 
    </listener> 

     <!-- 2. Spring Security 로그아웃 설정을 위한 필터 설정 --> 
     <filter> 
     <filter-name>EgovSpringSecurityLogoutFilter</filter-name> 
     <filter-class>egovframework.com.sec.security.filter.EgovSpringSecurityLogoutFilter</filter-class> 
     </filter> 
     <filter-mapping> 
     <filter-name>EgovSpringSecurityLogoutFilter</filter-name> 
     <url-pattern>/uat/uia/actionLogout.do</url-pattern> 
     </filter-mapping> 

     <!-- 2. Spring Security 로그인 설정을 위한 필터 설정 --> 
     <filter> 
     <filter-name>EgovSpringSecurityLoginFilter</filter-name> 
     <filter-class>egovframework.com.sec.security.filter.EgovSpringSecurityLoginFilter</filter-class> 
       <init-param> 
         <description>로그인 실패시 반활 될 URL설정</description> 
         <param-name>loginURL</param-name> 
         <param-value>/uat/uia/egovLoginUsr.do</param-value> 
       </init-param> 
     </filter> 
     <filter-mapping> 
     <filter-name>EgovSpringSecurityLoginFilter</filter-name> 
     <url-pattern>*.do</url-pattern> 
     </filter-mapping> 

     <!-- 3. EgovSSO 로그아웃 설정을 위한 필터 설정 --> 
    <!-- 
    <filter> 
     <filter-name>EgovSSOLogoutFilter</filter-name> 
     <filter-class>egovframework.com.uat.sso.filter.EgovSSOLogoutFilter</filter-class> 
       <init-param> 
         <description>SSO Global Logout 처리후 반환되는 페이지 설정</description> 
         <param-name>returnURL</param-name> 
         <param-value>/j_spring_security_logout</param-value> 
       </init-param> 
     </filter> 
     <filter-mapping> 
     <filter-name>EgovSSOLogoutFilter</filter-name> 
     <url-pattern>/uat/uia/actionLogout.do</url-pattern> 
     </filter-mapping> 
     --> 

     <!-- 3. EgovSSO 로그인 설정을 위한 필터 설정 --> 
    <!-- 
    <filter> 
     <filter-name>EgovSSOLoginFilter</filter-name> 
     <filter-class>egovframework.com.uat.sso.filter.EgovSSOLoginFilter</filter-class> 
     </filter> 
     <filter-mapping> 
     <filter-name>EgovSSOLoginFilter</filter-name> 
     <url-pattern>*.do</url-pattern> 
     </filter-mapping> 
     --> 


    <!-- AjaxTags configuration START--> 
    <servlet> 
     <servlet-name>ajaxServlet</servlet-name> 
     <servlet-class>net.sourceforge.ajaxtags.servlets.SourceLoader</servlet-class> 
     <init-param> 
      <param-name>prefix</param-name> 
      <param-value>/ajaxtags</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ajaxServlet</servlet-name> 
     <url-pattern>/ajaxtags/js/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>ajaxServlet</servlet-name> 
     <url-pattern>/ajaxtags/img/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>ajaxServlet</servlet-name> 
     <url-pattern>/ajaxtags/css/*</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
     <welcome-file>egovDevIndex.jsp</welcome-file> 
    </welcome-file-list> 
    <login-config> 
     <auth-method>BASIC</auth-method> 
    </login-config> 

    <session-config> 
     <session-timeout>600</session-timeout> 
    </session-config> 

    <error-page> 
     <error-code>404</error-code> 
     <location>/code404.jsp</location> 
    </error-page> 
    <error-page> 
     <error-code>500</error-code> 
     <location>/code500.jsp</location> 
    </error-page> 

</web-app> 

đây là /WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
     수정일     수정자       수정내용 
    =========  ======= ================================================= 
    2011.09.07 서준식     로그인 체크 인터셉터 추가 
    2011.09.29 이기하     에러페이지 경로수정 
--> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
                 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

     <!-- The controllers are autodetected POJOs labeled with the @Controller annotation. --> 
     <context:component-scan base-package="egovframework, example"> 
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> 
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> 
     </context:component-scan> 


     <!-- For Pagination Tag --> 
     <bean id="imageRenderer" class="egovframework.com.cmm.ImagePaginationRenderer"/> 

     <bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager"> 
       <property name="rendererType"> 
         <map> 
           <entry key="image" value-ref="imageRenderer"/> 
         </map> 
       </property> 
     </bean> 

     <!-- 
       - The form-based controllers within this application provide @RequestMapping 
       - annotations at the type level for path mapping URLs and @RequestMapping 
       - at the method level for request type mappings (e.g., GET and POST). 
       - In contrast, ClinicController - which is not form-based - provides 
       - @RequestMapping only at the method level for path mapping URLs. 
       - 
       - DefaultAnnotationHandlerMapping is driven by these annotations and is 
       - enabled by default with Java 5+. 
     --> 

     <!-- 
       - This bean processes annotated handler methods, applying Application-specific PropertyEditors 
       - for request parameter binding. It overrides the default AnnotationMethodHandlerAdapter. 
     --> 
     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
       <property name="webBindingInitializer"> 
         <bean class="egovframework.com.cmm.web.EgovBindingInitializer"/> 
       </property> 
       <property name="customArgumentResolvers"> 
         <list> 
           <bean class="egovframework.rte.ptl.mvc.bind.CommandMapArgumentResolver"/> 
         </list> 
       </property> 
     </bean> 

     <!-- 로그인 체크가 필요한 URL과 로그인 여부를 체크해줄 인터셉터를 등록한다. --> 
     <!-- 
     <bean id="selectAnnotaionMapper" class="egovframework.rte.ptl.mvc.handler.SimpleUrlAnnotationHandlerMapping" p:order="1"> 
       <property name="interceptors"> 
         <list> 
           <ref local="authenticInterceptor" /> 
         </list> 
       </property> 
       --> 
       <!-- 로그인 체크가 필요한 URL 리스트 --> 
       <!-- 
       <property name="urls"> 
         <set> 
           <value>/**/*.do</value> 
         </set> 
       </property> 
     </bean> 
     --> 

     <!-- 로그인 체크 인터셉터 --> 
     <!-- <bean id="authenticInterceptor" class="egovframework.com.cmm.interceptor.AuthenticInterceptor"> --> 
     <!-- 인증 체크가 필요 없는 URL 리스트 --> 
     <!-- 
       <property name="permittedURL"> 
         <set> 
           <value>/uat/uia/[a-zA-Z]+\.do</value> 
           <value>/EgovLeft.do</value> 
           <value>/uat/uia/actionLogin.do</value> 
         </set> 
       </property> 
     </bean> 
     --> 

     <!-- 
       - This bean resolves specific types of exceptions to corresponding logical 
       - view names for error views. The default behaviour of DispatcherServlet 
       - is to propagate all exceptions to the servlet container: this will happen 
       - here with all other types of exceptions. 
     --> 
     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
       <property name="defaultErrorView" value="egovframework/com/cmm/error/egovError"/> 
       <property name="exceptionMappings"> 
         <props> 
           <prop key="org.springframework.dao.DataAccessException">egovframework/com/cmm/error/dataAccessFailure</prop> 
           <prop key="org.springframework.transaction.TransactionException">egovframework/com/cmm/error/dataAccessFailure</prop> 
           <prop key="egovframework.rte.fdl.cmmn.exception.EgovBizException">egovframework/com/cmm/error/egovBizException</prop> 
           <prop key="org.springframework.web.HttpSessionRequiredException">egovframework/com/uat/uia/EgovLoginUsr</prop> 
         </props> 
       </property> 
     </bean> 

     <!-- 
       - This bean configures the 'prefix' and 'suffix' properties of 
       - InternalResourceViewResolver, which resolves logical view names 
       - returned by Controllers. For example, a logical view name of "vets" 
       - will be mapped to "/WEB-INF/jsp/vets.jsp". 
     --> 
     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1" 
        p:viewClass="org.springframework.web.servlet.view.JstlView" 
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> 

     <!-- 
       - Message source for this context, loaded from localized "messages_xx" files. 
       - Could also reside in the root application context, as it is generic, 
       - but is currently just used within Application's web tier. 
     --> 
     <!-- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="messages/message-common"/> --> 
</beans> 

Xin hãy giúp tôi, nhờ

+0

Bạn đang sử dụng phiên bản Tomcat nào? –

Trả lời

66

java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

Đó phương pháp đã được bổ sung trong Servlet 2.5.

Vì vậy, vấn đề này có thể có ít nhất 3 nguyên nhân:

  1. Các servlet container không hỗ trợ Servlet 2.5.
  2. web.xml không được khai báo phù hợp với Servlet 2.5 hoặc mới hơn.
  3. Đường dẫn lớp thời gian chạy của webapp được rải rác với các tệp JAR chứa container servlet của một phiên bản/phiên bản thùng chứa servlet khác không hỗ trợ Servlet 2.5.

Để giải quyết nó,

  1. Hãy chắc chắn rằng servlet container của bạn hỗ trợ ít nhất Servlet 2.5. Đó là ít nhất Tomcat 6, Glassfish 2, JBoss AS 4.1, etcetera. Tomcat 5.5 chẳng hạn hỗ trợ ở Servlet 2.4 cao nhất. Nếu bạn không thể nâng cấp Tomcat, thì bạn cần hạ cấp Spring xuống phiên bản tương thích với Servlet 2.4.
  2. Đảm bảo rằng khai báo gốc của web.xml tuân thủ Servlet 2.5 (hoặc mới hơn, ít nhất là cao nhất bất kỳ thời gian chạy đích nào của bạn hỗ trợ). Ví dụ, xem thêm ở đâu đó giữa chừng our servlets wiki page.
  3. Đảm bảo rằng bạn không có bất kỳ thư viện cụ thể nào của thùng chứa servlet như servlet-api.jar hoặc j2ee.jar trong /WEB-INF/lib hoặc thậm chí tệ hơn, JRE/lib hoặc JRE/lib/ext. Họ không thuộc về đó. Đây là một sai lầm của người mới bắt đầu khá phổ biến trong một nỗ lực để phá vỡ các lỗi biên dịch trong một IDE, xem thêm How do I import the javax.servlet API in my Eclipse project?.
+0

Câu trả lời hay, chỉ có điểm 2 là không chính xác. Ít nhất với Spring, nếu bạn không khai báo Servlet 2.5 trong web.xml của bạn, nhưng thay vì sử dụng 2.4 hoặc trước đó, sẽ không có mã Servlet 2.5 cụ thể được thực hiện, do đó bạn không thể gặp lỗi của OP. –

+4

Trong trường hợp của tôi, một phụ thuộc khác (Axis2) đang tải servlet-api 2.3. Đặt Axis2 vào cuối các phụ thuộc của tôi trong pom.xml đã giải quyết được vấn đề. Tnx! – TinkerTank

+0

Có nhiều hơn 3 loại này không? Tôi đột nhiên nhận được thông báo này sau khi yum tự động cập nhật từ tomcat 6.0.35 lên 6.0.36. Không có ứng dụng web hoặc lọ nào đã thay đổi theo như các bản ghi hiển thị ... –

Các vấn đề liên quan