java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
Posted
技术标签:
【中文标题】java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;【英文标题】: 【发布时间】:2012-01-26 13:27:51 【问题描述】:我在重启 Tomcat 后将文件战争部署到 Tomcat 时遇到了韩国 egovframework 的问题,它显示如下错误:
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
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)
....................................................
我用过:
[root@localhost 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)
这里是文件 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>
这里是/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>
【问题讨论】:
你使用的是什么 Tomcat 版本? 【参考方案1】:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
那个方法是在Servlet 2.5中添加的。
所以这个问题至少有3个原因:
-
servlet 容器不支持 Servlet 2.5。
web.xml
未声明符合 Servlet 2.5 或更高版本。
webapp 的运行时类路径中充斥着不支持 Servlet 2.5 的不同 servlet 容器 make/version 的特定于 servlet 容器的 JAR 文件。
为了解决它,
-
确保您的 servlet 容器至少支持 Servlet 2.5。那至少是 Tomcat 6、Glassfish 2、JBoss AS 4.1 等等。例如 Tomcat 5.5 最高支持 Servlet 2.4。如果您无法升级 Tomcat,则需要将 Spring 降级到与 Servlet 2.4 兼容的版本。
确保
web.xml
的根声明符合Servlet 2.5(或更新版本,至少是您的目标运行时支持的最高版本)。例如,另见中途某处our servlets wiki page。
确保在/WEB-INF/lib
中没有任何特定于servlet 容器的库,例如servlet-api.jar
或j2ee.jar
,或者更糟的是JRE/lib
或JRE/lib/ext
。他们不属于那里。这是初学者在尝试规避 IDE 中的编译错误时很常见的错误,另请参阅 How do I import the javax.servlet API in my Eclipse project?。
【讨论】:
好答案,只有第 2 点不正确。至少对于 Spring,如果你没有在 web.xml 中声明 Servlet 2.5,而是使用 2.4 或更早版本,则不会执行 Servlet 2.5 特定的代码,所以你不会得到 OP 的错误。跨度> 就我而言,另一个依赖项(Axis2)正在加载 servlet-api 2.3。将 Axis2 放在我在 pom.xml 中的依赖项的末尾解决了这个问题。 Tnx! 还有这三个以外的吗? yum 从 tomcat 6.0.35 自动更新到 6.0.36 后,我突然收到此消息。就日志显示而言,没有任何 webapps 或 jars 发生变化...... 这个答案解决了我的问题。我的 pom.xml 中有 javax.servlet 2.4 版并且遇到了问题。但是,当我将其更改为 2.5 时,我的问题得到了解决。感觉很棒:D 我在 pom 中声明了 servlet 3.0.1,但另一个依赖项在 servlet-api-2.4 上具有传递性。我排除了 2.4 版本,一切正常。以上是关于java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;的主要内容,如果未能解决你的问题,请参考以下文章