it-swarm.com.de

RESTful Tutorial für die Erstellung von Webservices mit Java, Eclipse. Apache Tomcat funktioniert nicht

Ich möchte eine einfache RESTful-Anwendung auf meinem PC erstellen und ausführen ... Ich verwende Java-Programmiersprache, Eclipse Helios IDE, Apache Tomcat 7-Server und Microsoft Windows XP-Betriebssystem.

Ich habe versucht, dieselbe Prozedur von dieses Tutorial (von 3 bis 3.4 Schritten) auf meinem PC zu replizieren, aber es funktioniert nicht.

Folgendes habe ich getan:

  • ein dynamisches Projekt in Eclipse mit Apache Tomcat 7-Einstellungen erstellt

  • legen Sie meine jar-Dateien Jersey und jsr311-api-1.0 in das Projektverzeichnis \WEB-INF\lib\

  • kopierte die Codeteile von der Webseite in mein Projekt

  • klicken Sie mit der rechten Maustaste auf das Projekt, klicken Sie auf "Ausführen als -> Auf Server ausführen".

  • versuchte den http://localhost:8080/de.vogella.jersey.first/rest/hello zu erreichen 

Aber es gibt was ich sehe:

Rest screenshot

Warum funktioniert es nicht? Was hat ich falsch gemacht? Warum?

Danke vielmals!

Bearbeiten: 

Folgendes sagt die Konsole:

25-set-2012 9.35.07 org.Apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the Java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\OpenVPN\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\Apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
25-set-2012 9.35.08 org.Apache.Tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.Eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
25-set-2012 9.35.10 org.Apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.10 org.Apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.10 org.Apache.catalina.startup.Catalina load
INFO: Initialization processed in 3459 ms
25-set-2012 9.35.10 org.Apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
25-set-2012 9.35.10 org.Apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
25-set-2012 9.35.11 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.core.ApplicationContext log
INFO: Marking servlet Jersey REST Service as unavailable
25-set-2012 9.35.12 org.Apache.catalina.core.StandardContext loadOnStartup
Grave: Servlet /de.vogella.jersey.first threw load() exception
Java.lang.ClassNotFoundException: javax.servlet.Filter
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:307)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:248)
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:632)
    at Java.lang.ClassLoader.defineClass(ClassLoader.Java:616)
    at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
    at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:283)
    at Java.net.URLClassLoader.access$000(URLClassLoader.Java:58)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:197)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:307)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:248)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1558)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1488)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:415)
    at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:397)
    at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:118)
    at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1048)
    at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:996)
    at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4741)
    at org.Apache.catalina.core.StandardContext$3.call(StandardContext.Java:5062)
    at org.Apache.catalina.core.StandardContext$3.call(StandardContext.Java:5057)
    at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:303)
    at Java.util.concurrent.FutureTask.run(FutureTask.Java:138)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908)
    at Java.lang.Thread.run(Thread.Java:619)
25-set-2012 9.35.12 org.Apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.12 org.Apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.12 org.Apache.catalina.startup.Catalina start
INFO: Server startup in 1790 ms

Vielleicht fehlt eine Klasse?

16
DavideChicco.it

Um Ihr Problem zu lösen, ohne Maven zu verwenden, müssen Sie Ihrem Projekt die JAX-RS-Facette hinzufügen. Hier passiert, dass Eclipse nicht die richtigen Bibliotheken auf dem Server bereitstellt. Auf diese Konfiguration können Sie über die Eigenschaften Ihres Projekts zugreifen Facetten des Projekts.

Um ehrlich zu sein, weiß ich nicht, welche spezifischen Gläser hinzugefügt werden müssen, um Jersey zum Laufen zu bringen, denn ich verwende Maven, um Abhängigkeiten zu verwalten. Also habe ich anstelle der Zip-Datei das Jersey-Bundle heruntergeladen und die JAX-RS-Facette damit konfiguriert. Die Auswirkung davon ist in den Eigenschaften | des Projekts ersichtlich Deployment Assembly, wo Jerseys Libs bereits für die Bereitstellung konfiguriert sind. Übrigens können Sie die bereitgestellten Bibliotheken manuell auf dem Server einrichten.

Aber dann fiel mir ein, warum ich Maven zum Verwalten von Abhängigkeiten verwende. Das Bundle enthält nicht alles, was zum Betrieb von Jersey erforderlich ist. Es fehlt das ASM-Glas (vorhanden in der Zip-Datei). Also musste ich es zum Build-Pfad für Projekte hinzufügen und die Deployment-Assembly manuell neu konfigurieren ....

Also hier ein Tutorial mit Maven, Jersey und Eclipse. Probieren Sie es aus und ziehen Sie Ihre Schlussfolgerungen :)

22
Gilson Costa

Ich habe das gleiche Tutorial durchlaufen, um meinen ersten RESTFUL-Service zu entwickeln. Am Anfang hatte ich auch einige Male 404-Fehler, also änderte ich ein paar Dinge, schließlich funktionierte es für mich. Das habe ich gemacht-

1) entfernte den Rest von der Registerkarte "URL-Muster"; Ich denke, das ist aus Versehen dort . 2) verwendet das Kontextstammverzeichnis in der URL anstelle des Paketnamens.

meine URL ist "http://mylocalhost:8080/contextroot/classname, die in der Annotation @path definiert ist.

ich hoffe es hilft.

3
Aruna

Das servlet.jar sollte nicht in der resultierenden Kriegsdatei (oder in WEB-INF/lib) sein. Es sollte vom Anwendungsserver selbst bereitgestellt werden. (Siehe Tomcat FAQ ) Wenn Sie den Maven zum Erstellen des Projekts verwenden, können Sie den Umfang des Servlet-APIs als provided ( link ) festlegen.

Eine ähnliche Frage hier auf StackOverflow .

2
Jiri Kremser

Ich habe Ihr Beispiel wiederholt und es funktioniert sofort auf meiner Maschine. Ich habe jersey-archive-1.14.Zip heruntergeladen und den gesamten Inhalt des enthaltenen lib-Verzeichnisses in WEB-INF/lib abgelegt, nicht nur Jersey und jsr311-api-1.0 jar wie Sie.

Die Gläser sind:

  • asm-3.1.jar
  • jackson-core-asl-1.9.2.jar
  • jackson-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • jackson-xc-1.9.2.jar
  • jersey-client-1.14.jar
  • jersey-core-1.14.jar
  • jersey-json-1.14.jar
  • jersey-server-1.14.jar
  • jersey-servlet-1.14.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar

Einige von ihnen könnten unnötig sein, Sie könnten versuchen, sie zu reduzieren. Aber fange mit allen an.

Die Fehlermeldung ist jedoch seltsam. Es besagt, dass javax.servlet.Filter fehlt, was in <your Tomcat dir>/lib/servlet-api.jar leben sollte. Diese Datei befindet sich immer im Klassenpfad, wenn Sie Tomcat ausführen.

2
ChrLipp

Sie müssen servlet.jar oder eine andere Jar-Datei, die javax.servlet.Filter enthält, aus Ihrem Verzeichnis WEB-INF/lib entfernen. 

Sie benötigen zwar die Klasse javax.servlet.Filter für den Kompilierungsklassenpfad, damit der Beispielcode kompiliert werden kann. Sie müssen jedoch sicherstellen, dass Sie diese Klasse nicht in Ihre Webanwendung aufnehmen. Aus dem Tomcat-Klassenlader HOWTO:

Wenn Tomcat gestartet wird, erstellt es eine Reihe von Klassenladern mit der Bezeichnung organisiert in den folgenden Eltern-Kind-Beziehungen, wobei die Der übergeordnete Klassenlader befindet sich über dem untergeordneten Klassenlader:

  Bootstrap
      |
   System
      |
   Common
   /     \   

Webapp1 Webapp2 ...

Grundsätzlich wird die (wahrscheinlich) servlet.jar in der webapp wahrscheinlich nicht richtig von der im Tomcat-Container konfigurierten Sicherheit gefunden. 

Sie können sehen, ob javax.servlet.Filter von einem seltsamen Speicherort geladen wird, indem Sie das ausführliche Laden der Klasse verbose:class aktivieren. Suchen Sie nach der Klasse, wenn sie nicht aus den Tomcat-Bibliotheken stammt, ist dies wahrscheinlich Ihr Problem.

1
stevedbrown

Fügen Sie alle Jars hinzu, die Sie in jersey 1.6-Archiv finden, laden Sie this archive herunter und fügen Sie alle Jars zum Ordner WebContent/WEB-INF/lib Ihres Projekts hinzu.

0
Ajit

Wie in den vorherigen Antworten erwähnt. Sie vermissen einige Gläser. Sie können diese JAR-Dateien entweder im Ordner " Project> WebContent> WEB-INF> lib> " oder im Ordner lib Ihres Webservers hinzufügen (z. B.\Apache-Tomcat\lib ). 

Versuchen Sie, eine Liste oder einen Screenshot Ihrer beiden lib-Ordner einzufügen, wenn Sie möchten, dass Sie genau wissen, welches Glas Ihnen fehlt. 

Hoffe das hilft

0
Ellipsis

Möglicherweise fehlt Ihnen servlet-api.jar. Fügen Sie die neueste Dose in Ihre/WEB-INF/lib-Klasse oder in den Klassenpfad ein.

0
Jeevan Patil

Ich hatte auch die HTTP-Status-404-Ausgabe nach demselben Tutorial.

Zuerst habe ich versucht, JAX-RS Project Facet in Eclipse mit den Jersey-Bibliotheken 1.18 und 2.15 festzulegen, aber es hat nicht funktioniert.

Schließlich löste ich das Problem, indem ich den Paketnamen (de.vogella.jersey.first) in der URL durch das Kontextstammverzeichnis (d. H. Den Eclipse-Projektnamen) ersetzte.

Dieses Tutorial von mkyong.com gab mir den Hinweis, die Lösung zu finden. Ich weiß jedoch nicht, ob der Paketname in der URL definitiv ein Fehler ist oder ob es einige Konfigurationsdetails gibt, die möglicherweise ebenfalls funktionieren.

Ich hatte diesen Fehler mehr als einen Tag! Es stellt sich heraus, dass das Problem von der Verwendung verschiedener Jersey-Versionen herrührt. Wenn Sie Ihren web.xml-Inhalt durch den unten angegebenen Inhalt ersetzen, ist dies in Ordnung! 

    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>de.vogella.jersey.first</param-value>
    </init-param>
    <init-param>
     <param-name>unit:WidgetPU</param-name>
     <param-value>persistence/widget</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

Ich hoffe, meine Antwort spart viel Zeit für jemanden, der sich auch für das gleiche Tutorial entscheidet! 

0
binte

Löschen Sie die servlet.jar aus dem Ordner WEB-INF/lib. Servlet.jar sollte nicht dabei sein, dadurch wurde das Problem für mich behoben. 

0
Amrit

Es scheint, dass es die Servlet-Trikotdosen nicht im Klassenpfad findet. Stellen Sie sicher, dass Sie sie einschließen. Ich gehe davon aus, dass Sie sich in einen Krieg packen und bereitstellen, bevor Sie dieses Recht testen. Prüfen Sie also einfach, ob der Krieg alle Gläser enthält, die Ihrer Anwendung zur Kompilierzeit zur Verfügung standen. 

0
user1707141

Soweit ich das beurteilen kann, führen Sie Tomcat in Eclipse aus. Ist es möglich, dass Sie nicht das Installationsverzeichnis auf Ihrem Computer verwenden (dh das Verzeichnis, in das Sie die JARs kopiert haben), sondern tatsächlich die temporäre Kopie verwenden, die Eclipse lokal erstellt (Entschuldigung, ich bin nicht auf meinem Dev-Computer atm kann die Details nicht überprüfen)?

Aus dem Speicher haben Sie zwei Möglichkeiten:

  1. Sie müssen das (Arbeits-) Verzeichnis, das Eclipse für Tomcat verwendet, in das Verzeichnis ändern, in dem Sie die Tomcat-Dateien haben.

  2. Sie müssen die JARs in Eclipse über die GUI-Schnittstelle in Eclipse zu Tomcat hinzufügen. 

Alternativ könnte ich hier völlig falsch liegen ;-)

EDIT: Einschließlich eines Screenshots des Bits, über das ich spreche.

Für meine Optionen oben:

  1. Sehen Sie sich die "Sever Locations" in der Mitte an, die "die Kontrolle über die Tomcat-Installation übernimmt".
  2. Sie fügen sie auf der Registerkarte Klassenpfad hinzu, wenn Sie auf den Link "Startkonfiguration öffnen" im Feld "Allgemeine Informationen" in der folgenden Abbildung klicken 

enter image description here

0
Doddie