java.lang.NoSuchMethodError: javax.servlet.Servl

2019-02-27 11:58发布

问题:

i want to have a servlet to process inputs from a standalone java program. how to deploy this servlet in jboss. I put the servlet.class file in WEB-INF/classes and in web.xml i gave the servlet url mapping as ".do". From my Java client program i opened connected to the servlet using a URL object. using localhost:8080/.do. BUT i am getting the folowing error:

  ERROR [org.apache.catalina.connector.CoyoteAdapter] An exception or error occurred in the container during the request processing: 
  java.lang.NoSuchMethodError: javax.servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set;
            at
     org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:567)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:359)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
            at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654)
            at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)

web.xml file contents :

<?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>

回答1:

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

This method is introduced in Servlet 3.0. This error can have at least the following causes:

  1. Your web.xml is not declared conform at least Servlet 3.0.

  2. Your servlet container does not support at least Servlet 3.0.

  3. You have servlet container specific libraries of an older version in /WEB-INF/lib.

To solve this problem,

  1. Ensure that your web.xml root declaration conforms 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. Ensure that you're deploying to a Servlet 3.0 compatible container. In case of JBoss AS that would be at least version 6.0.0.

  3. Ensure that you don't have those libraries in /WEB-INF/lib. They do not belong there. This is a common beginner's mistake to "solve" compilation errors they faced in their IDE. See also How do I import the javax.servlet API in my Eclipse project?

You've declared your web.xml conform Servlet 2.2. This is definitely wrong. Fix it accordingly.