不知道为什么:ResourceConfig实例不包含任何根资源类

我是jersey和网络服务的新手,我尝试运行一个简单的RESTful Web服务。 我关注了http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/,但我的项目没有使用maven,我下载了jersey.1.17.1.jar并将其包含在我的项目路径。

当我想在http://localhost:8080/sycotext/rest/service/SOMETEXT上调用服务时出现此错误:

 HTTP Status 500 - Servlet.init() for servlet sycoText-servlet threw exception 

这是堆栈跟踪:

 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.(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) 

这是我的代码:

 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(); } 

这是我的web.xml:

   Restful Web Application  sycoText-servlet  com.sun.jersey.spi.container.servlet.ServletContainer   com.sun.jersey.config.property.packages ir.sycotech.text.server.service  1   sycoText-servlet /rest/*   

我已经在web.xml文件中正确指定了我的包名,我不知道为什么会出现这个错误,如果有人知道是什么问题,我将非常感激

错误:

com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。

意味着Jersey无法找到服务类。 这可能是由com.sun.jersey.config.property.packages参数的错误命名包引起的,或者如果包名称正确但它不包含资源类(人们有时忘记在类上添加@Path注释) )。

但我发现你的设置没有任何问题。 所以这应该工作!

检查您的应用程序是否正确部署,以及您的WEB-INF/classes文件夹实际上是否包含具有该软件包的正确文件夹路径的类。

做一个完整的清洁和重建,然后再试一次。

我不是你面临的实际问题。 您可以下载一个示例https://github.com/kdmalviyan/RestWithJerseyExample.git您必须在下载后执行以下操作:1。mvn clean install 2.将war部署到您的服务器3.访问“JerseyExample-0.0.1-SNAPSHOT / rest / hello / hello Kuldeep Singh“在你的服务器上

你会得到如下的输出:泽西说:你好Kuldeep Singh

我建议你先按照确切的步骤进行任何改动。 如果您得到正确的结果,那么您可以根据需要进行修改。 请确保您是否重命名包,也在web.xml中重命名包。

我刚刚使用Grizzly和jersey遇到了这个问题。

当您启动一个Grizzly容器时,您必须通过一张地图告诉Grizzly在哪里可以找到您的资源。 如果您像我一样从原型创建项目,或者只是移动了一些东西,那么您还必须更新这个容易被忽略的值。

  final static String YOUR_PACKAGE_NAME_GOES_HERE = "where.ever.your.resource.package.happens.to.be" final Map initParams = new HashMap(); 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); 

我也遇到过这个问题。 为了让它发挥作用,我做了两件事,第一件事与这个问题无关。

首先,我正在使用运动衫1.19。 但是,我没有意识到服务器上的WEB-INF/lib有一个名为javax.ws.rs-api-2.0.jar的文件。 这个文件是两年前添加的,IIRC与jersey 2.x一起使用,但不是1.x. 我有效地删除了该文件(将其重命名为.bak作为其扩展名)。

其次,我在Eclipse中为Web服务创建了一个JAR文件。 我没有使用Maven或Ant或类似的东西。 只是一个简单的出口。 现在,错误可能意味着您的代码中没有引用jersey的内容。 但是我想,我写了一个简单的测试类,一切都应该正常工作。 原来导出没有正确创建JAR文件。 我打开JAR,课程是空的。 难怪它产生了这个错误! 我再次导出,而不是勾选Export generated class files and resources ,我勾选了Export all output folders for checked projects 。 我在这个项目中也有多个包,这可能与导出无法正常运行的原因有关。 一旦我这样做,它就有效了!

我再次尝试导出,但这一次,我勾选了Export generated class files and resources并选择了项目中的每个资源。 与上次不同的是我选择了.settings 。 上次没有选择.settings 。 同样,这也有效!

我希望这可以帮助那些有类似问题的人。 有时,它只是确认你的JAR文件是正确的愚蠢。 我使用java反编译器来检查JAR文件。

我遇到类似的问题。 请检查您的初始化过程是否已正确注册api类。

在您的情况下,初始化类是ir.sycotech.text.server.service

您需要在服务中注册所有api类。

这是我的例子:

如果未注册以下类,我将遇到错误(register(CtoFService.class); register(FtoCService.class); register(TriggerCmd.class);)

  * javax.ws.rs.Application my.mimos.hcserver.init.MyApplication * @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!*****"); } } 

请确保您的软件包“com.sun.jersey.config.property.packages”在Web.xml中正确注册…祝您好运!

   Jersey REST Service com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages com.rest.service   com.sun.jersey.api.json.POJOMappingFeature true  1  

如果您尝试使用HttpServerFactory,则必须传递PackagesResourceConfig。

例:

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

我有同样的问题,我通过指定类包和完全删除load-on-startup解决了这个问题,即:

  my-servlet-name  com.sun.jersey.spi.container.servlet.ServletContainer   com.sun.jersey.config.property.packages my.package.name    

我想因为我在同一个软件包下有多个servlet而且Jersey不会选择在启动时加载的“root”。

好吧,上述答案都不适合我。 不过,他们让我仔细检查每一步和包名。 正如Bogdan所说, target/classes/文件夹中没有编译类。

检查您的应用程序是否正确部署,以及您的WEB-INF / classes文件夹实际上是否包含具有该软件包的正确文件夹路径的类。

我的解决方案只是清理项目并编译不同的。 而不只是为了mvn war:war我做了:

$ mvn clean:clean $ mvn compile $ mvn war:war

然后它编译得很好,OP错误消失了。