Java >> Java Tutorial >  >> Tag >> java.lang

java.lang.NoSuchMethodError javax.servlet.ServletContext.getVirtualServerName()

Kürzlich bin ich bei der Arbeit an meinem Spring Boot-Projekt auf eine Fehlermethode gestoßen, die getVirtualServerName nicht gefunden hat. Dieser Fehler war sehr häufig und lästig. Während der Ausführung des Spring Boot-Projekts stieß ich auf NoSuchMethodError javax.servlet.ServletContext.getVirtualServerName() Ausnahme. Trotz der Maven-Abhängigkeit war es schwieriger herauszufinden, wo die servlet-api jar kam in meinen Projekterstellungspfad. In meinem Beitrag zum Umgang mit Ausnahmen habe ich gezeigt, wie man besser mit Ausnahmen umgeht.

Ausgabe –

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122) [na:1.8.0_91]
at java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_91]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:911) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890) [tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.6.jar:8.5.6]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6]
... 6 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6]
... 6 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:170) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6]
... 8 common frames omitted
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1125) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6]
... 10 common frames omitted

Grund

Je nach Baupfad servlet-api jar, das vorhanden ist, ist nicht die richtige Version. Wenn es älter als 3.1 ist, enthält es die Methode getVirtualServerName() nicht .

Wie habe ich dieses Problem gelöst?

Ich beschreibe die Lösung separat, aber wie ich das Problem hier analysiert habe. Ich habe servlet-api durchlaufen jar und versucht, die Klasse ServletContext zu finden die diese Methode enthält. Aber die Jar-Datei, die ich in meinem Projekt hatte, enthielt diese Methode nicht. Deshalb das Problem. Dann war es einfach, basierend auf Maven-Abhängigkeiten herauszufinden. Sobald ich einen Abhängigkeitsbaum hatte, konnte ich die Abhängigkeit festnageln, die die alte Version von servlet-api brachte Glas.

Lösung –

  1. Ändern Sie die Version von servlet-api Glas
  2. Wenn Sie bedenken, dass dies ein Spring-Boot-Projekt ist, stellen Sie eine Version von Tomcat bereit, anstatt den standardmäßigen Tomcat 8.x zu verwenden, den Spring-Boot bereitstellt.
  3. In meinem Fall bestand die Lösung darin, javaee.jar zu entfernen aus dem Erstellungspfad, der servlet-api brachte einer älteren Version. Als ich die Java-Laufzeitbibliothek von 1.8 auf 1.7 geändert habe, lief das Projekt wie am Schnürchen.

Schlussfolgerung

In diesem Beitrag habe ich gezeigt, wie der Fehler getVirtualServerName in ServletContext behoben werden kann. Wenn Ihnen dieser Beitrag gefallen hat, abonnieren Sie meinen Blog.


No
Java-Tag