Getting NoSuchMethodError:javax.servlet.ServletContext.getVirtualServerName()

2022-09-01 04:28:08

在 Tomcat 8 中部署服务期间,我遇到了一个问题。得到以下错误:

Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;at org.apache.tomcat.websocket.server.WsServerContainer.(WsServerContainer.java:149) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244) at org.apache.catalina.util.Base Lifecycle.start(LifecycleBase.java:150) ...10更多

方法在Servlet 3.1中引入,从我的jar中提取后,我得到了以下细节:getVirtualServerNameMANIFEST.MFservlet-api

Specification-Title: Java API for Servlets 
Specification-Version: 3.1 
Specification-Vendor: Sun Microsystems, Inc. 
Implementation-Title: javax.servlet 

这说明它有3.1。那么这个错误还有其他原因吗?请帮忙


答案 1

检查您的所有 Maven(或等效)依赖项,并确保您 (或很可能是另一个依赖项) 没有拉入 3.1 之前的版本的 ,该版本可能优先于 Tomcat 8 中的内容。如果您已经手动部署,请确保您没有手动将任何 servlet-api JAR 复制到 Tomcat 本身。javax.servlet / servlet-api

请参见: https://stackoverflow.com/a/26232535/954442


答案 2

该方法已添加到 Servlet 3.1 的 ServletContext 中。请参阅 java 文档的方法 getVirtualServerNamegetVirtualServerName

此问题有 3 个主要原因:

  1. 您的 servlet 版本早于 3.1。

  2. 其他一些jar具有版本早于3.1的servlet。

  3. 您的雄猫版本早于 8

要解决它,您可以尝试以下方法。

I.检查您的pom.xml以获取以下代码。

  <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.1.0</version>
    </dependency>

如果你的pom.xml有上面的代码,它仍然会有这个问题。你可以做第二种方式。

II.检查你的另一个罐子有没有参考过那个罐子。例如,有指罐子。pom.xml:javax.servlet-apiorg.apache.santuariojavax.servlet-api

<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>   
</dependency> 

但是当你查看maven依赖项时,它指的是版本比3.1早于2.3的jar。javax.servlet-api

enter image description here

所以你应该排除2.3版本。pom.xml:

<!-- exclude servlet-api 2.3 jar-->  
<dependency>  
    <groupId>org.apache.santuario</groupId>  
    <artifactId>xmlsec</artifactId>  
    <version>1.4.3</version>  
    <exclusions>  
        <exclusion>  
            <groupId>javax.servlet</groupId>  
            <artifactId>servlet-api</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency>  

<!-- servlet-api 3.1 version has getVirtualServerName() -->  
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
</dependency> 

III.弹簧靴运行默认雄猫7.所以定义你的tomcat版本8而不是tomcat 7。所以添加你的pom.xml代码:

   <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <tomcat.version>8.5.5</tomcat.version>
    </properties>

推荐