Je suis nouveau dans le jersey et les services Web et j'essaie de lancer un simple service Web RESTful. J'ai suivi http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/ mais mon projet n'utilise pas maven et je télécharge le maillot.1.17.1 .jar et l'inclure dans mon chemin de projet.
Lorsque je souhaite appeler le service le http://localhost:8080/sycotext/rest/service/SOMETEXT
J'obtiens cette erreur:
HTTP Status 500 - Servlet.init() for servlet sycoText-servlet threw exception
c'est la trace de la pile:
javax.servlet.ServletException: Servlet.init() for servlet sycoText-servlet threw exception
org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:504)
org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:76)
org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:934)
org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:515)
org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1010)
org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:640)
org.Apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.Java:223)
org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1618)
org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1576)
Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
Java.lang.Thread.run(Thread.Java:724)
root cause
com.Sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
com.Sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.Java:99)
com.Sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.Java:1331)
com.Sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.Java:168)
com.Sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.Java:774)
com.Sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.Java:770)
com.Sun.jersey.spi.inject.Errors.processWithErrors(Errors.Java:193)
com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:770)
com.Sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.Java:765)
com.Sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.Java:489)
com.Sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.Java:319)
com.Sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.Java:605)
com.Sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.Java:210)
com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:374)
com.Sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.Java:557)
javax.servlet.GenericServlet.init(GenericServlet.Java:160)
org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:504)
org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:76)
org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:934)
org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:515)
org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1010)
org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:640)
org.Apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.Java:223)
org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1618)
org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1576)
Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
Java.lang.Thread.run(Thread.Java:724)
voici mon code:
package ir.sycotech.text.server.service;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
@Path("/service")
public class SycoTextService {
@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg) {
String output = "Jersey say : " + msg;
return Response.status(200).entity(output).build();
}
et voici mon web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee
http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<servlet>
<servlet-name>sycoText-servlet</servlet-name>
<servlet-class>
com.Sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>ir.sycotech.text.server.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sycoText-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
J'ai spécifié correctement mon nom de fichier dans le fichier web.xml et je ne sais pas pourquoi j'ai eu cette erreur, je serai vraiment reconnaissant si quelqu'un sait quel est le problème
L'erreur:
com.Sun.jersey.api.container.ContainerException: l'instance ResourceConfig ne contient aucune classe de ressources racine.
signifie que Jersey ne peut pas trouver de classes de service. Cela peut être dû à un package mal nommé pour le paramètre com.Sun.jersey.config.property.packages
Ou si le nom du package est correct mais qu'il ne contient pas de classes de ressources (les gens oublient parfois d'ajouter l'annotation @Path
À la classe) .
Mais je ne trouve rien de mal à votre configuration. Cela devrait donc fonctionner!
Vérifiez que votre application s'est correctement déployée et que votre dossier WEB-INF/classes
Contient réellement votre classe avec le chemin de dossier approprié pour le package.
Effectuez un nettoyage et une reconstruction complets, puis réessayez.
J'ai eu le même problème, que j'ai résolu en spécifiant les deux packages de classes ET en supprimant load-on-startup, c'est-à-dire:
<servlet>
<servlet-name>my-servlet-name</servlet-name>
<servlet-class>
com.Sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>my.package.name</param-value>
</init-param>
<!-- <load-on-startup>1</load-on-startup> -->
</servlet>
Je suppose que parce que j'avais plus d'un servlet sous le même paquet et Jersey ne pouvait pas choisir celui "root" à charger au démarrage.
Je rencontre un problème similaire. Veuillez vérifier votre processus d'initialisation si vous avez correctement enregistré la classe api.
Dans votre cas, la classe d'initialisation est ir.sycotech.text.server.service
Vous devez enregistrer toutes les classes d'api en service.
Voici mon exemple:
Je frapperai l'erreur si les classes suivantes ne sont pas enregistrées, (registre (CtoFService.class); registre (FtoCService.class); registre (TriggerCmd.class);)
*<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>my.mimos.hcserver.init.MyApplication</param-value>
</init-param>*
@ApplicationPath("/HCRestServer/")
public class MyApplication extends ResourceConfig{
public MyApplication() {
System.out.println("******Started!*****");
register(CtoFService.class);
register(FtoCService.class);
register(TriggerCmd.class);
register(CORSResponseFilter.class);
System.out.println("******Done registration!*****");
}
}
J'ai également rencontré ce problème. J'ai fait deux choses pour le faire fonctionner, la première étant sans rapport avec ce problème.
Tout d'abord, j'utilise le maillot 1.19. Cependant, je ne savais pas qu'il y avait un fichier nommé javax.ws.rs-api-2.0.jar
dans le WEB-INF/lib
sur le serveur. Ce fichier a été ajouté il y a deux ans et, l'IIRC, fonctionne conjointement avec le maillot 2.x mais pas 1.x. J'ai effectivement supprimé le fichier (renommé avec . Bak comme extension).
Deuxièmement, j'ai créé un fichier JAR dans Eclipse pour le service Web. Je n'ai pas utilisé Maven ou Ant ou quelque chose comme ça. Juste une simple exportation. Maintenant, l'erreur peut signifier que rien dans votre code ne fait référence au maillot. Mais j'ai écrit un cours de test simple et tout devrait fonctionner, pensai-je. Il s'avère que l'exportation n'a pas créé correctement le fichier JAR. J'ai ouvert le JAR et la classe était vide. Pas étonnant que cela génère cette erreur! J'ai exporté une fois de plus et au lieu de cocher la case Export generated class files and resources
, J'ai coché Export all output folders for checked projects
. J'ai également plusieurs packages dans ce projet, ce qui pourrait être lié à la raison pour laquelle l'exportation ne fonctionnait pas correctement. Une fois que j'ai fait ça, ça a marché!
J'ai essayé à nouveau l'exportation, mais cette fois, j'ai coché Export generated class files and resources
et a sélectionné toutes les ressources du projet. Ce qui était différent de la dernière fois, j'ai été sélectionné .settings
. Dernière fois, .settings
n'a pas été sélectionné. Encore une fois, cela a fonctionné aussi!
J'espère que cela aide quelqu'un là-bas avec un problème similaire. Parfois, c'est juste quelque chose d'aussi stupide que de confirmer que votre fichier JAR est correct. J'utilise décompilateur Java pour inspecter le fichier JAR.
Je ne sais pas le problème réel auquel vous êtes confronté. Vous pouvez télécharger un exemple https://github.com/kdmalviyan/RestWithJerseyExample.git vous devez prendre les actions suivantes après le téléchargement: 1. mvn clean install 2. deploy war to your server 3. access " JerseyExample-0.0.1-INSTANTANÉ/reste/bonjour/bonjour Kuldeep Singh "sur votre serveur
Vous obtiendrez une sortie comme: Jersey dit: bonjour Kuldeep Singh
Je vous suggère de suivre les étapes exactes sans rien changer en premier. Si vous obtenez un résultat correct, vous pouvez le modifier selon vos besoins. Veuillez vous assurer que si vous renommez le package, renommez le package dans web.xml également.
Si vous essayez d'utiliser HttpServerFactory, vous devez transmettre un PackagesResourceConfig.
Exemple:
ResourceConfig rc = new PackagesResourceConfig("com.package");
HttpServerFactory.create(getBaseURI(), rc);
Veuillez vous assurer que votre package "com.Sun.jersey.config.property.packages" est enregistré correctement dans Web.xml ... Bonne chance !!
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servletclass>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>com.rest.service</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Eh bien, aucune des réponses ci-dessus n'a fonctionné pour moi. Ils m'ont cependant fait vérifier chaque étape et chaque nom de package. Comme Bogdan l'a dit, il n'y avait pas de classes compilées à l'intérieur du target/classes/
dossier.
Vérifiez que votre application s'est déployée correctement et que votre dossier WEB-INF/classes contient réellement votre classe avec le chemin de dossier approprié pour le package.
Ma solution consistait simplement à nettoyer le projet et à en compiler différemment. Au lieu de simplement aller pour mvn war:war
J'ai fait:
$ mvn clean:clean $ mvn compile $ mvn war:war
Ensuite, il s'est bien compilé et l'erreur OP a disparu.
Je viens de rencontrer ce problème en utilisant Grizzly avec un maillot.
Lorsque vous lancez un conteneur Grizzly, vous devez passer une carte indiquant à Grizzly où trouver vos ressources. Si vous avez créé votre projet à partir d'un archétype comme je l'ai fait ou simplement déplacé certaines choses, vous devez également mettre à jour cette valeur qui est facile à ignorer.
final static String YOUR_PACKAGE_NAME_GOES_HERE = "where.ever.your.resource.package.happens.to.be"
final Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.Sun.jersey.config.property.packages",
YOUR_PACKAGE_NAME_GOES_HERE);
System.out.println("Starting grizzly...");
SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams);