web-dev-qa-db-fra.com

Tutoriel de création de services Web RESTful avec Java, Eclipse. Apache Tomcat, ne fonctionne pas

J'aimerais créer et exécuter une simple application RESTful sur mon ordinateur . J'utilise le langage de programmation Java, sur Eclipse Helios IDE, avec le serveur Apache Tomcat 7, sur un système d'exploitation Microsoft Windows Xp.

J'ai essayé de reproduire la même procédure de ce tutoriel (de 3 à 3.4 étapes) sur mon ordinateur, mais cela ne fonctionne pas.

Voici ce que j'ai fait:

  • créé un projet dynamique sur Eclipse, avec les paramètres Apache Tomcat 7

  • place mes fichiers jar Jersey et jsr311-api-1.0 dans le répertoire \WEB-INF\lib\ du projet

  • copié les parties de code de la page Web dans mon projet

  • clic droit sur le projet, cliqué sur "Exécuter en tant que -> Exécuter sur le serveur"

  • essayé d'atteindre le http://localhost:8080/de.vogella.jersey.first/rest/hello 

Mais il y a ce que je vois:

Rest screenshot

Pourquoi cela ne fonctionne-t-il pas? Qu'est-ce que j'ai mal fait? Pourquoi?

Merci beaucoup!

Modifier: 

Voici ce que dit la console:

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

Peut-être qu'il manque une classe?

16
DavideChicco.it

Pour résoudre votre problème, sans utiliser Maven, vous devez ajouter une facette JAX-RS à votre projet. Ce qui se passe ici est qu’Eclipse ne déploie pas les bonnes bibliothèques sur le serveur. Cette configuration est accessible via les propriétés de votre projet. Les facettes du projet.

Pour être honnête, je ne sais pas quels pots ajouter pour que Jersey fonctionne, car j'utilise Maven pour gérer les dépendances. Ainsi, au lieu du fichier Zip, j'ai téléchargé le ensemble de Jersey et configuré la facette JAX-RS avec ce dernier. L'effet de ceci peut être vu sur les propriétés du projet | Deployment Assembly, où les bibliothèques de Jersey sont déjà configurées pour être déployées. En passant, vous pouvez configurer manuellement les bibliothèques déployées sur le serveur.

Mais ensuite je me suis rappelé pourquoi j'utilise Maven pour gérer les dépendances. Le paquet ne contient pas tout ce dont il a besoin pour exécuter Jersey. Il manque le pot asm (présent dans le fichier Zip). Je devais donc l'ajouter au chemin de génération des projets et reconfigurer manuellement l'assembly de déploiement ....

Donc, voici un tutorial avec Maven, Jersey et Eclipse. Essayez et tirez vos conclusions :)

22
Gilson Costa

J'ai suivi le même tutoriel pour développer mon premier service RESTFUL. Au début, j’ai aussi eu quelques erreurs 404 quelques fois, donc j’ai changé peu de choses, finalement cela a fonctionné pour moi. C'est ce que j'ai fait-

1) a supprimé le reste de l'onglet Motif d'URL; Je pense que c'est là par erreur . 2) utilisé la racine de contexte dans l'URL plutôt que le nom du paquet.

mon URL est, "http://mylocalhost:8080/contextroot/classname qui est défini dans l'annotation @path.

j'espère que ça aide.

3
Aruna

Servlet.jar ne devrait pas être dans le fichier war résultant (ou dans WEB-INF/lib). Il devrait être fourni par le serveur d'application lui-même. (voir FAQ ) de Tomcat Si vous utilisez Maven pour générer le projet, vous pouvez définir la portée de l'api de servlet sur provided ( link ).

Une autre question similaire ici sur StackOverflow .

2
Jiri Kremser

J'ai répété votre exemple et cela fonctionne hors de la boîte sur ma machine. J'ai téléchargé jersey-archive-1.14.Zip et mis tout le contenu du répertoire lib inclus dans WEB-INF/lib, pas seulement Jersey et jsr311-api-1.0 jar comme vous l'avez fait.

Les pots sont:

  • 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
  • serveur-maillot-1.14.jar
  • jersey-servlet-1.14.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar

Certains d’entre eux pourraient être inutiles, vous pourriez essayer de les réduire. Mais commençons par tous.

Le message d'erreur est étrange, cependant. Il est dit que javax.servlet.Filter est manquant, ce qui devrait vivre dans <your Tomcat dir>/lib/servlet-api.jar. Ce fichier est toujours sur le chemin de classe lorsque vous exécutez Tomcat.

2
ChrLipp

Vous devez supprimer servlet.jar ou tout autre fichier jar contenant javax.servlet.Filter de votre répertoire WEB-INF/lib. 

Bien que vous ayez besoin de la classe javax.servlet.Filter sur votre chemin de classe de compilation pour que l'exemple de code soit compilé, vous devez vous assurer que vous n'incluez pas cette classe dans votre application Web. Dans le HOWTO Tom Load Load de classe:

Lorsque Tomcat est démarré, il crée un ensemble de chargeurs de classe qui sont organisées dans les relations parent-enfant suivantes, où le le chargeur de classe parent est au-dessus du chargeur de classe enfant:

  Bootstrap
      |
   System
      |
   Common
   /     \   

Webapp1 Webapp2 ...

Fondamentalement, le fichier (probablement) servlet.jar de l'application Web n'a probablement pas été trouvé correctement par la sécurité configurée dans le conteneur Tomcat. 

Vous pouvez voir si javax.servlet.Filter est en cours de chargement depuis un emplacement étrange en activant le chargement de la classe prolixe verbose:class. Recherchez la classe, si elle ne provient pas des bibliothèques Tomcat, c'est probablement votre problème.

1
stevedbrown

Vous devez ajouter tous les fichiers jars que vous trouverez dans l’archive jersey 1.6, télécharger this archive et ajouter tous les fichiers jar au dossier WebContent/WEB-INF/lib de votre projet.

0
Ajit

Comme les réponses précédentes mentionnées. Il vous manque des pots. Vous pouvez ajouter ces fichiers jar dans le dossier Project> WebContent> WEB-INF> lib> ou dans le dossier lib de votre serveur Web (par exemple,\Apache-Tomcat\lib ). 

Essayez de coller la liste ou la capture d’écran de vos deux dossiers lib, si vous souhaitez que nous vous indiquions le fichier jar exact qui vous manque. 

J'espère que cela t'aides

0
Ellipsis

Peut-être qu'il vous manque servlet-api.jar. Ajoutez le dernier fichier jar dans votre/WEB-INF/lib ou classpath et voyez si cela fonctionne ou non.

0
Jeevan Patil

J'ai eu le problème HTTP Status 404 aussi, après le même tutoriel.

J'ai d'abord essayé de configurer JAX-RS Project Facet dans Eclipse avec les bibliothèques Jersey 1.18 et 2.15, mais cela n'a pas fonctionné.

Enfin, j'ai résolu le problème en remplaçant le nom du package (de.vogella.jersey.first) dans l'URL par la racine de contexte (c'est-à-dire le nom du projet Eclipse).

Ce tutoriel par mkyong.com m'a donné l'indice pour trouver la solution. Quoi qu'il en soit, je ne sais pas si le nom du paquet dans l'URL est vraiment une erreur ou s'il existe des détails de configuration qui pourraient le faire fonctionner également.

0

J'ai eu cette erreur pendant plus d'un jour! Il se trouve que le problème vient de l’utilisation de différentes versions de Jersey. Si vous remplacez votre contenu web.xml par le contenu que je présente ci-dessous, tout ira bien! 

    <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>

Espérons que ma réponse permettra de gagner beaucoup de temps pour quelqu'un d'autre qui décide également de suivre le même tutoriel! 

0
binte

Supprimez le fichier servlet.jar du dossier WEB-INF/lib. Servlet.jar ne devrait pas être là, cela a résolu le problème pour moi. 

0
Amrit

Il semble qu'il ne trouve pas les jarres de servlet jersey dans le classpath. Assurez-vous de les inclure. Je suppose que vous emballez dans une guerre et déployez avant de tester ce droit. Vérifiez donc si la guerre inclut tous les pots disponibles pour votre application au moment de la compilation. 

0
user1707141

Autant que je sache, vous utilisez Tomcat depuis Eclipse. Il est possible que vous n'utilisiez pas le répertoire d'installation de votre ordinateur (c'est-à-dire celui dans lequel vous avez copié les fichiers JAR), mais utilisiez en fait la copie temporaire créée localement par Eclipse (désolé, je ne suis pas sur mon ordinateur dev ne peux pas vérifier les détails)?

De mémoire, vous avez 2 options:

  1. Vous devez modifier le répertoire (de travail) utilisé par Eclipse pour que Tomcat soit celui dans lequel vous avez réellement les fichiers Tomcat.

  2. Vous devez ajouter les fichiers JAR à Tomcat dans Eclipse à l'aide de l'interface graphique dans Eclipse. 

Sinon, je peux me tromper complètement ici ;-)

EDIT: Y compris une capture d'écran de la partie dont je parle.

Pour mes options ci-dessus:

  1. Voir "L'emplacement des serveurs" au milieu doit figurer dans celui qui "Prend le contrôle de l'installation de Tomcat".
  2. Vous les ajoutez dans l'onglet Classpath lorsque vous cliquez sur le lien "Ouvrir la configuration de lancement" dans la zone "Informations générales" de l'image ci-dessous. 

enter image description here

0
Doddie