web-dev-qa-db-fra.com

Aucune idée pourquoi: l'instance ResourceConfig ne contient aucune classe de ressources racine

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

15
Vahid Haratian

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.

28
Bogdan

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.

0
PJ_Finnegan

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!*****");
    }   
}
0
ct.tan

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.

0
user3621633

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.

0
Kuldeep Singh

Si vous essayez d'utiliser HttpServerFactory, vous devez transmettre un PackagesResourceConfig.

Exemple:

ResourceConfig rc = new PackagesResourceConfig("com.package");
HttpServerFactory.create(getBaseURI(), rc);
0
otaviodecampos

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

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.

0
MarAvFe

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);
0
Ben Glasser