web-dev-qa-db-fra.com

Récupération de NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName ()

Je rencontre un problème lors du déploiement d'un service dans Tomcat 8. Obtention de l'erreur suivante:

Causée par: Java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName () Ljava/lang/String; à org.Apache.Tomcat.websocket.server.WsServerContainer. (WsServerContainer.Java:149) à org.Apache.Tomcat.websocket.server.WsSci.init (WsSci.Java:131) à org.Apache.Tomcat.websocket.server.WsSci.onStartup (WsSci.Java:47) à org.Apache.catalina.core.StandardContext.startInternal (StandardContext.Java:5244) à org.Apache.catalina.util.LifecycleBase.start (LifecycleBase.Java:150) ... 10 plus

La méthode getVirtualServerName a été introduite dans Servlet 3.1 et après avoir extrait MANIFEST.MF de mon jarre servlet-api, j'ai obtenu les détails suivants:

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

Ce qui dit que c'est avoir 3.1. Y a-t-il une autre raison à cette erreur? S'il vous plaît aider

17
Rehman

Vérifiez toutes vos dépendances Maven (ou équivalentes) et assurez-vous que vous (ou probablement une autre dépendance) n'extrayez pas une version antérieure à la version 3.1 du javax.servlet / servlet-api qui peut avoir priorité sur celle de votre Tomcat 8. Si vous avez manuellement déployé, assurez-vous que vous n'avez pas copié manuellement les fichiers JAR de servlet-api dans Tomcat même.

Voir: https://stackoverflow.com/a/26232535/954442

14
Andrew Regan

la méthode getVirtualServerName a été ajoutée dans ServletContext dans Servlet 3.1. Trouver la méthode du document Java getVirtualServerName

ce problème peut avoir au moins 3 causes:

  1. votre version de servlet est plus ancienne que 3.1.

  2. autre jar a la servlet version plus ancienne que 3.1.

  3. votre version de Tomcat a plus de 8 ans

pour le résoudre, vous pouvez essayer la méthode ci-dessous.

I. vérifier votre pom.xml s’il existe le code ci-dessous.

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

si votre pom.xml a le code ci-dessus, il aurait toujours ce problème. vous pouvez faire le deuxième chemin.

II. pour vérifier votre autre jarre, reportez-vous à la jarre javax.servlet-api. Par exemple, le org.Apache.santuario doit faire référence au jar javax.servlet-api. le pom.xml:

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

mais lorsque vous examinez les dépendances maven, vous vous référez au fichier jar javax.servlet-api dont la version est antérieure de 3.1 à 3.1. 

 enter image description here

vous devez donc exclure la version 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. spring boot exécute Tomcat 7 par défaut. Définissez donc votre version de Tomcat 8 au lieu de Tomcat 7. ajoutez donc le code de votre 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>
7
Dang

J'ai eu cette erreur sur IntelliJ avec Maven après avoir mis à jour IntelliJ.

Je pourrais faire les tests avec maven mais pas depuis mon IDE.

J'ai résolu le problème en supprimant les fichiers ./idea et project.iml et en rechargeant le projet.

5
zlandorf

Résolu Sur mon Mac avec Java 8, le problème était avec Tomcat téléchargé à partir du site et décompressé.

Mon problème a été résolu car il y avait un fichier supplémentaire servlet-api.jar qui a été récupéré. Il venait de /Library/Java/Extensions/servlet-api.jar

Pour le trouver sur votre système, vous pouvez utiliser Sudo find/-name servlet-api.jar

Supprimez-le en le sauvegardant ailleurs.

Je suivais ceci pour l'installation https://Gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

2
Ankur

Spring Boot exécutera Tomcat 7 par défaut, vous devez remplacer le fichier maven build Tomcat.version dans votre pom.xml. Voir ci-dessous pour exécuter Tomcat 8.0.30

<properties>
  <Tomcat.version>8.0.30</Tomcat.version>
</properties>

Devrait résoudre votre problème.

2
MrSimpleMind

Après une énorme douleur et un examen minutieux de toutes ces réponses superposées, la seule chose qui a finalement fonctionné pour moi a été de passer de Tomcat8 à Tomcat7. Je sais que ce n’est pas une solution idéale, et c’est peut-être une nouvelle installation de Tomcat qui a résolu mon problème. Si tout échoue, essayez-le.

0
user2008914