虽然这是一个古老的问题,但我仍然找不到解决这个问题的答案。 如果您发现我的任何陈述不正确,请更正。
我有一个 Java Face 应用程序,并将 REST 用于 Web 服务。我不认为 Face 与我的问题有任何关系。 web.xml 是:
<servlet>
<servlet-name>NDREST</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>com.bi.nd.webservice</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>NDREST</servlet-name>
<url-pattern>/nd/*</url-pattern>
</servlet-mapping>
我在 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 <init>
SEVERE: The ResourceConfig instance does not contain any root resource classes.
有人建议将 asm.jar、jsr-api.jar、jersey-server.jar 和 jersey-core.jar 复制到应用程序 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 类 NOT FOUND 是一条重要消息吗?
最佳答案
我有同样的错误信息,并通过修改我的 web.xml 文件解决了它。确保里面有这个:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>your.package.name.here</param-value>
</init-param>
关于java - Jersey REST ResourceConfig 实例不包含任何根资源类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111074/