2011-12-23 10 views
29

mam problem z egovframework Korei kiedy wdrożyli plik WAR do Tomcat po moim ponownym uruchomieniu Tomcat, to pokazał się błąd jak poniżej: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) 
.................................................... 

użyłem:

[[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) 

Oto plik 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> 

Oto /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> 

Proszę mi pomóc, dzięki

+0

Jakiej wersji Tomcat używasz? –

Odpowiedz

66

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

Metoda ta została dodana w Servlet 2.5.

więc ten problem może mieć co najmniej 3 przyczyny:

  1. Pojemnik aplet nie obsługuje Servlet 2.5.
  2. Numer web.xml nie jest zgodny z serwletem 2.5 lub nowszym.
  3. Ścieżka klasy środowiska wykonawczego aplikacji WWW jest zaśmiecona plikami JAR kontenera specyficznymi dla kontenera innego producenta kontenera servletu, który nie obsługuje serwletu 2.5.

Aby go rozwiązać,

  1. Upewnij się, że kontener serwletów obsługuje przynajmniej Servlet 2.5. To są przynajmniej Tomcat 6, Glassfish 2, JBoss AS 4.1 itd. Tomcat 5.5 obsługuje na przykład najwyższy serwlet 2.4. Jeśli nie możesz uaktualnić Tomcat, musisz obniżyć wersję Spring do wersji zgodnej z Servletem 2.4.
  2. Upewnij się, że deklaracja roota web.xml jest zgodna z serwletem 2.5 (lub nowszym, co najmniej najwyższym niezależnie od tego, co obsługuje docelowe środowisko). Na przykład zobacz także gdzieś w połowie drogi our servlets wiki page.
  3. Upewnij się, że nie mam konkretnych bibliotek każdy kontener serwletów jak servlet-api.jar lub j2ee.jar w /WEB-INF/lib lub nawet gorsze, JRE/lib lub JRE/lib/ext. Nie należą tam. Jest to dość powszechny błąd początkującego, który próbuje obejść błędy kompilacji w IDE, zobacz także How do I import the javax.servlet API in my Eclipse project?.
+0

Dobra odpowiedź, tylko punkt 2 jest nieprawidłowy. Przynajmniej na wiosnę, jeśli nie zadeklarujesz serwletu 2.5 w twoim pliku web.xml, ale zamiast tego użyjesz wersji 2.4 lub wcześniejszej, nie zostanie wykonany specjalny kod serwletu 2.5, więc nie możesz uzyskać błędu OP. –

+4

W moim przypadku inna zależność (Axis2) ładowała serwlet-api 2.3. Umieszczenie Axis2 na końcu moich zależności w pom.xml rozwiązało problem. Tnx! – TinkerTank

+0

Czy są więcej niż te 3? Nagle otrzymuję tę wiadomość po yum auto-updated z tomcat 6.0.35 na 6.0.36. Żaden z webaplików ani słoików nie zmienił się tak długo, jak logi pokazują ... –

Powiązane problemy