Java >> Java tutorial >  >> Tag >> java.lang

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

For nylig, mens jeg arbejdede på mit Spring Boot-projekt, stødte jeg på en fejlmetode, der ikke blev fundet getVirtualServerName. Denne fejl var meget hyppig og generende. Under udførelsen af ​​Spring Boot-projektet løb jeg ind i NoSuchMethodError javax.servlet.ServletContext.getVirtualServerName() undtagelse. På trods af at have været afhængig af maven, var det sværere at finde ud af, hvor servlet-api jar kom ind på min projektbyggersti. I mit indlæg om håndtering af undtagelser viste jeg, hvordan man håndterer undtagelser bedre.

Udgave –

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

Årsag

Afhængigt af byggestien, servlet-api jar, der findes, er ikke den rigtige version. Hvis den er ældre end 3.1, indeholder den ikke metoden getVirtualServerName() .

Hvordan løste jeg dette problem?

Jeg beskriver løsningen separat, men hvordan jeg analyserede problemet her. Jeg gik igennem servlet-api jar og forsøgte at finde klassen ServletContext der indeholder denne metode. Men Jar-filen, som jeg havde i mit projekt, indeholdt ikke denne metode. Det er derfor problemet. Så var det nemt at finde ud af baseret på maven-afhængigheder. Da jeg havde et afhængighedstræ, var jeg i stand til at fastgøre den afhængighed, der bragte den gamle version af servlet-api krukke.

Løsning –

  1. Skift versionen af ​​servlet-api krukke
  2. I betragtning af at dette er et spring-boot-projekt, skal du levere en version af tomcat i stedet for at bruge standard tomcat 8.x, som spring-boot giver.
  3. I mit tilfælde var rettelsen at fjerne javaee.jar fra byggestien, som bragte servlet-api af en ældre version. Da jeg ændrede Java runtime-biblioteket fra 1.8 til 1.7, kørte projektet som en charme.

Konklusion

I dette indlæg viste jeg, hvordan man løser fejlen getVirtualServerName i ServletContext. Hvis du kunne lide dette indlæg, så abonner på min blog.


No
Java tag