Jersey REST ResourceConfig实例不包含任何根资源类

虽然这是一个古老的问题,但我仍然找不到能够做到这一点的答案。 如果您发现我的任何陈述不正确,请更正。

我有一个Java Face应用程序并使用REST作为Web服务。 我不认为Face与我的问题有任何关系。 web.xml是:

 NDREST  com.sun.jersey.spi.container.servlet.ServletContainer   com.sun.jersey.config.property.packages com.bi.nd.webservice  1   NDREST /nd/*  

我在web.xml中有更多的servlet,因为它是一个带有Trinidad等的Face应用程序。

在com.bi.nd.webservice包中,我的资源类是:

 import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Produces(MediaType.APPLICATION_XML) @Path("/hello") public class TransactionResource { public TransactionResource() { } @GET @Produces(MediaType.TEXT_PLAIN) public String itWorks() { return "Get is OK"; } } 

我的类具有@GET的事实足以将自己标识为资源类。
更别说所有其他复杂性了,我在Eclipse中用Ant编译了我的源代码,我在catalina.out文件中遇到了这个错误:

 May 24, 2011 8:48:46 AM com.sun.jersey.api.core.PackagesResourceConfig init INFO: Scanning for root resource and provider classes in the packages: com.bi.nd.webservice May 24, 2011 8:48:46 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate INFO: Initiating Jersey application, version 'Jersey: 1.7 05/20/2011 11:04 AM' May 24, 2011 8:48:46 AM com.sun.jersey.server.impl.application.RootResourceUriRules  SEVERE: The ResourceConfig instance does not contain any root resource classes. 

有人建议将asm.jar,jsr-api.jar,jersey-server.jar和jersey-core.jar复制到app WEB-INF / lib中。 我这样做了,但仍然无效。 我发现这个建议有点奇怪,因为WEB-INF / lib是Eclipse将从构建路径安装所有依赖库的地方。 它不是我们手动放置库的地方。

有人解释说这个错误与Java插件和Jersey的编写方式有关。 但那是几年前的事了。

有人可以向我解释为什么我一直有这个问题吗?

后续:虽然来自REST网站,但定义为Root资源类的资源类是POJO(普通旧Java对象),它们使用@Path注释或至少有一个使用@Path注释的方法或请求方法指示符(如@GET), @ PUT,@ POST或@DELETE。 资源方法是使用请求方法指示符注释的资源类的方法。 本节介绍如何使用Jersey注释Java对象以创建RESTful Web服务。

我必须将@Path(“/ hello”)添加到我的类中,突然Jersey可以找到我的资源类

现在catalina.out文件看起来像:

 May 24, 2011 3:13:02 PM com.sun.jersey.api.core.PackagesResourceConfig init INFO: Scanning for root resource and provider classes in the packages: com.bi.nd.webservice May 24, 2011 3:13:02 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO: Root resource classes found: class com.bi.nd.webservice.TransactionResource May 24, 2011 3:13:02 PM com.sun.jersey.api.core.ScanningResourceConfig init INFO: No provider classes found. May 24, 2011 3:13:02 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate INFO: Initiating Jersey application, version 'Jersey: 1.7 05/20/2011 11:04 AM' 

但问题远未结束。 我尝试访问URL http://localhost:8080/nd/hello ,我仍然得到404 NOT FOUND。 Provider类找不到重要的消息吗?

我有相同的错误消息,并通过修改我的web.xml文件解决它。 确保它有这个:

  com.sun.jersey.config.property.packages your.package.name.here  

我发现泽西岛无法找到根资源的另一个原因。 错误信息是相同的,所以我认为这是一个很好的理由来记录根本原因,以防其他人偶然发现它。

我有一个根资源类,其上有以下注释:

 @Singleton @Path("/helloWorld") @Service(...) // my own custom annotation public class MyRootResource { ... } 

这将导致Jersey内的根资源扫描失败。

修复方法是更改​​注释的顺序:

 @Service(...) // my own custom annotation @Singleton @Path("/helloWorld") public class MyRootResource { ... } 

这很有效。

首先,请注意,在类上使用@GET不足以将其标识为根资源类; 该类必须有一个@Path。 你的确如此,所以这不是问题所在。

我遇到了和你一样的问题:它在Eclipse中运行,但是当我为外部使用而构建它时却没有用。

我正在使用嵌入式Jetty,其main()如下所示:

 public static void main(String argv[]) { try { // from http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty Server server = new Server(8080); ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath("/"); server.setHandler(contextHandler); // http://stackoverflow.com/questions/9670363/how-do-i-programmatically-configure-jersey-to-use-jackson-for-json-deserializa final PackagesResourceConfig prc = new PackagesResourceConfig("com.ultimatefoodfight.server.api"); final Map prcProperties = prc.getProperties(); prcProperties.put(JSONConfiguration.FEATURE_POJO_MAPPING, true); // from http://stackoverflow.com/questions/7421574/embedded-jetty-with-jersey-or-resteasy contextHandler.addServlet(new ServletHolder(new ServletContainer(prc)), "/*"); server.start(); server.join(); } catch(Exception e) { System.out.println(e); } } 

(当嵌入Jetty时,这取代了web.xml。)com.sun.jersey.api.core.PackagesResourceConfig扫描指定类的根资源提供程序类 – 我确定web.xml只是指向相同。 这在Eclipse中运行良好。 服务器启动在控制台中正确报告:

 INFO: Scanning for root resource and provider classes in the packages: com.ultimatefoodfight.server.api Jul 29, 2012 7:31:28 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO: Root resource classes found: class com.ultimatefoodfight.server.api.Users class com.ultimatefoodfight.server.api.Contests 

但是,当我在服务器上启动应用程序时,我只获得前两行,并且没有找到Root资源类。

事实certificate,当你制作一个jar子时,它的构造方式有不同的选择; 特别是,如果您只是通过列出类的路径来实现它,那么您只需获得这些条目。 但是如果你用一个外卡将jar指向目录,你也可以获得所有中间路径。 请参阅此消息,了解有关我的示例: https : //groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ 。

PackagesResourceConfig类依赖于具有包名称的目录,以便在其中查找类。 我回到了Eclipse,在“Export …> Jar”对话框的底部找到了“添加目录条目”的选项。 我打开它,再次导出jar,然后扫描找到了我的资源类。 您需要在构建环境中找到一些类似的选项。

我刚刚花了5到6个小时摔跤,最后解决了这个问题。 这也许对你有用。

我一直在使用的源代码可以在Lars Vogel的教程页面上找到 。 使用Apache Tomcat 6.0.20,asm-all-3.3.1.jar,jersey-bundle-1.17.1.jar和jsr311-api-1.1.1.jar我获得了与OP相同的结果,即

 INFO: Root resource classes found: class com.mypackage.MyClass 13/03/2013 4:32:30 PM com.sun.jersey.api.core.ScanningResourceConfig init INFO: No provider classes found. 

我在各种部署文件中进行了以下设置:

 context root = rivets /rest @Path("/hello") 

尝试使用以下URL访问资源时出现404错误

  http://localhost:8080/rivets/rest/hello 

最终能够通过将url-pattern更改为:

 /rest/* 

虽然当我开始介绍更复杂的资源时,我不确定这会如何。 无论如何,希望这可能对某人有所帮助。

我发现“找不到提供者类”的消息很可怕,但并不重要。

“ResourceConfig实例不包含任何根资源类”是一个更大的问题。

我发现资源类需要用@Path注释,并且提供者类(如果你有一个 – 我们使用一个用于将exception映射到HTTP响应代码)需要用@Provider注释,并且两者都需要在合适的包裹,然后泽西岛会找到它们。

你可能需要使用这样的url

 http://localhost:8080//nd/hello 

所以我通过答案阅读并仍然有同样的问题。 我解决了如下问题。

在“WEB-INF”文件夹中添加了“jetty-web.xml”。 因此:src / main / webapp / WEB-INF / jetty-web.xml

jetty-web.xml的内容是:

    /YourEndpoint  

我的rest现在可以在:

 http://localhost:8080/YourEndpoint/webresources/someMethod 

希望这有助于那里的人。

我有同样的问题。 通过在web.xml中修复init-param标记下的param-value来解决它。 默认情况下,Eclipse在web.xml中将项目名称设置为display-name。 这不应该复制到param-value ,而是复制到Java包。

   com.sun.jersey.config.property.packages com.test.demo  

希望这可以帮助。

要解决此问题,请validation您的MapperIn类,需要指定Path:

 import javax.ws.rs.GET; import javax.ws.rs.OPTIONS; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.lot.account.api.doc.GetMemberAccountsIn; import com.lot.common.doc.CommonApi; import com.lot.common.doc.FlowData; import com.lot.security.authorization.RequestData; @Path("/account/member/") public class MapperIn { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/{memberId}") public GetAccountIn prepareGetAccount(@PathParam("memberId") String memberId) { // create apiInput GetAccountIn apiInput = new GetAccountIn (); // map values from url apiInput.setMemberId(memberId); return apiInput; } //... }