【问题标题】:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set;java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set;
【发布时间】:2012-01-23 09:32:28
【问题描述】:

我想要一个 servlet 来处理来自独立 java 程序的输入。如何在 jboss 中部署这个 servlet。我将 servlet.class 文件放在 WEB-INF/classes 和 web.xml 中,我将 servlet url 映射为“.do”。从我的 Java 客户端程序中,我使用 URL 对象打开连接到 servlet。使用 localhost:8080/.do。但我收到以下错误:

ERROR [org.apache.catalina.connector.CoyoteAdapter] 请求处理过程中容器出现异常或错误: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set; 在 org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:567) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:359) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)

web.xml 文件内容:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "java.sun.com/j2ee/dtds/web-app_2_2.dtd">; 
<web-app> 
     <servlet>
         <servlet-name>ReverseServlet</servlet-name> 
         <servlet-class>ReverseServlet</servlet-class> 
     </servlet> 
     <servlet-mapping>
          <servlet-name>ReverseServlet</servlet-name> 
          <url-pattern>/*.do</url-pattern> 
     </servlet-mapping> 
</web-app>

【问题讨论】:

  • 如果可能的话还有你的 servlet 代码。您在服务器中提到的方法似乎不存在或 web.xml 中有一些拼写错误
  • ttp://java.sun.com/j2ee/dtds/web-app_2_2.dtd" rel="nofollow" target="_blank">java.sun.com/j2ee/dtds/web-app_2_2.dtd"> ReverseServletReverseServletReverseServlet /*.do
  • 嗨,请从“cmets”部分删除 web.xml 内容。我已在您的“问题”中添加了这些内容。在添加内容时,我注意到 元素后面有分号 (;)。删除该分号并重新部署应用程序。也许它会工作
  • 我不明白你。你能详细解释一下吗? der 在 doctype 之后没有分号。

标签: java servlets jboss


【解决方案1】:

java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set;

这个方法是 Servlet 3.0 中的introduced。此错误至少可能有以下原因:

  1. 您的 web.xml 未声明至少符合 Servlet 3.0。

  2. 您的 servlet 容器至少不支持 Servlet 3.0。

  3. 您在 /WEB-INF/lib 中有旧版本的 servlet 容器特定库。

为了解决这个问题,

  1. 确保您的 web.xml 根声明符合 Servlet 3.0:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    
        <!-- Config here. -->
    
    </web-app>
    
  2. 确保您正在部署到与 Servlet 3.0 兼容的容器。在 JBoss AS 的情况下,至少版本为 6.0.0。

  3. 确保/WEB-INF/lib 中没有这些库。他们不属于那里。这是初学者在“解决”他们在 IDE 中遇到的编译错误时的常见错误。另见How do I import the javax.servlet API in my Eclipse project?

您已声明您的 web.xml 符合 Servlet 2.2。这绝对是错误的。相应地修复它。

【讨论】:

  • 我觉得这只是答案的一半。显然,可以运行 Servlet 2.2 应用程序而不会遇到此异常;在 Servlet 3.0 发布之前,并不是所有网站都被永久破坏。
  • @ruakh:我没有说这是不可能的。如果您实际上无法自己在 Servlet 3.0 容器上运行 Servlet 2.2 webapp,那么您的 webapp 与答案中的第 3 点冲突。
  • OP 没有说明他正在尝试使用 Servlet 3.0。您的回答甚至说“您已声明您的 web.xml 符合 Servlet 2.2。这绝对是错误的”,但我看不出有任何依据。问题显然是两件事之间的版本不匹配;您的答案是将 2.2 的内容更改为 3.0,但 OP 实际上可能需要将 3.0 的内容更改为 2.2。
  • @ruakh:OP 的 web.xml 中的行 &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "java.sun.com/j2ee/dtds/web-app_2_2.dtd"&gt; 就是这样做的。
  • 不,你误会我了。 “您已声明您的 web.xml 符合 Servlet 2.2”部分显然是正确的;这是“这绝对是错误的”部分,我没有看到任何依据。
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多