泽西岛 REST 资源配置实例不包含任何根资源类

2022-09-02 09:52:32

虽然这是一个古老的问题,但我仍然找不到答案来使这项工作。如果您发现我的任何陈述不正确,请更正。

我有一个Java Face应用程序,并将REST用于Web服务。我不认为Face与我的问题有任何关系。网络.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>

我在网络上还有很多服务.xml因为is是特立尼达的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复制到 app WEB-INF/lib 中。我这样做了,但它仍然不起作用。我发现这个建议有点奇怪,因为WEB-INF/lib是Eclipse从构建路径安装所有依赖库的地方。这不是我们手动放置库的地方。

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

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

后续:尽管从 REST 网站开始,定义为根资源类的资源类是 POJO(普通旧 Java 对象),它们要么with@Path注释,要么至少有一个方法用 @Path 或请求方法指示符(如 @GET、@PUT、@POST 或 @DELETE)进行注释。资源方法是使用请求方法指示符注释的资源类的方法。本节介绍如何使用泽西岛对 Java 对象进行批注以创建 RESTful Web 服务。

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

现在,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,但仍然收到 404 未找到。找不到提供程序类是重要邮件吗?http://localhost:8080/nd/hello


答案 1

我有相同的错误消息,并通过修改我的web.xml文件来解决它。确保它包含以下内容:

<init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>your.package.name.here</param-value>
</init-param>

答案 2

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

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

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

这将导致泽西岛内的根资源扫描失败。

解决方法是更改注释的顺序:

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

这有效。


推荐