Ich baue REST API in Java mit Jersey und Maven. Ich habe Tomcat 9 als Server verwendet. Alles funktioniert gut, bis ich versucht habe, RestAssured, Hamcrest, und JUnit heute zu installieren. Plötzlich haben alle meine Endpunkte 500 interne Serverfehler ausgegeben. Die Hauptursache für den Fehler 500 ist Java.lang.NoClassDefFoundError: org/glassfish/jersey/internal/inject/Binder.
Was ich diese 2 Stunden gemacht habe:
org/glassfish/jersey/internal/inject/Binder
bei Google, aber ohne Erfolg.Dieses Problem macht mich frustriert. Irgendeine Idee, warum dieser Fehler passiert ist? Danke im Voraus!
Hier ist der Auszug aus dem Serverprotokoll:
SEVERE: Ausnahme für Servlet-Jersey-Webanwendung zuordnen Java.lang.ClassNotFoundException: org.glassfish.jersey.internal.inject.Binder at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass (WebappClassLoaderBase.Java:1275 ) unter org.Apache.catalina.loader.WebappClassLoaderBase.loadClass (WebappClassLoaderBase.Java:1109) unter org.glassfish.jersey.servlet.ServletContainer.init (ServletContainer.Java:178) unter org.glassfish.jersey.servlet.Servlet. init (ServletContainer.Java:370) bei javax.servlet.GenericServlet.init (GenericServlet.Java:158) bei org.Apache.catalina.core.StandardWrapper.initServlet (StandardWrapper.Java:1183) bei org.Apache.catalina.core .StandardWrapper.loadServlet (StandardWrapper.Java:1099) bei org.Apache.catalina.core.StandardWrapper.allocate (StandardWrapper.Java:779) bei org.Apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.Java: org.Apache.catalina.core.StandardContextValve.invoke (StandardContextValve.Java:96) at org.Apache.catali na.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:475) at org.Apache.catalina.core.StandardHostValve.invoke (StandardHostValve.Java:140) at org.Apache.catalina.valves.ErrorReportValve.valve.in 80) bei org.Apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.Java:624) bei org.Apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.Java:87) bei org.ApacheAdapter.catalina.catalina:87) .service (CoyoteAdapter.Java:341) at org.Apache.coyote.http11.Http11Processor.service (Http11Processor.Java:498) at org.Apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.Java:66) at org.Apache. coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.Java:796) bei org.Apache.Tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.Java:1368) bei org.Apache.Tomcat.util.net.SocketProcessorBase Führen Sie (SocketProcessorBase.Java:49) unter Java.util.concurrent.ThreadPoolExecutor.runWorker (Unknown Source) unter Java.util.concurre aus nt.ThreadPoolExecutor $ Worker.run (unbekannte Quelle) bei org.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.Java:61) bei Java.lang.Thread.run (unbekannte Quelle)
Unten ist meine pom.xml
Datei: (mit RestAssured, Hamcrest und JUnit)
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.9.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Unten ist meine web.xml-Datei:
<web-app version="2.5" 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_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.accelbyte.vincent.emailist.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
Unten ist meine Projektstruktur:
Sehr wahrscheinlich gibt es ein Versionsunterschied zwischen Core Jersey und einer der Jersey-Erweiterungsbibliotheken, die diese Binder-Klasse importieren. Stellen Sie sicher, dass alle Jersey-bezogenen Module explizite Versionen haben (und sie zueinander passen). Oder noch besser, korrigieren Sie Ihre Versionen, indem Sie den Jersey-Bund importieren. Z.B.:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>2.26-b03</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Danach kann Ihr Hauptabschnitt <debendencies>
die Versionen auslassen.
Ich habe das gleiche Problem mit verschiedenen Versionen. Stellen Sie sicher, dass Ihre Jersey-Bean-Validierung und Jersey-Container-Servlet Versionen gleich sind.
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22</version>
</dependency>
<!-- bean validation -->
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>2.22</version>
</dependency>