Java Jersey Rest:未找到提供程序类。 (访问 URL 时出现 404 错误)

Posted

技术标签:

【中文标题】Java Jersey Rest:未找到提供程序类。 (访问 URL 时出现 404 错误)【英文标题】:Java Jersey Rest : No provider classes found. (404 error when accessing URL) 【发布时间】:2011-09-28 22:29:44 【问题描述】:

编辑:我没有意识到所有请求都首先进入“Apache”,然后被重定向到 Tomcat。我在apache2.conf 文件中添加了一个新的重定向。详情请见accepted answer。

我遇到了与这个问题完全相同的问题。 Jersey REST The ResourceConfig instance does not contain any root resource classes 然而,用户从未回答过这个问题。

我正在使用 Tomcat,没有 maven。我按照本教程进行操作。 http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

我根据文章对 web.xml 进行了更改 即新的 servlet 和 servlet 映射是使用正确的包名称创建的。

<servlet>
  <servlet-name>Jersey REST Service</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>sample.hello.resources</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping> 

我已经将以下jar部署到tomcat

asm.jar
jersey-server.jar
jersey-core.jar
jsr311.jar

tomcat启动日志有以下异常。

    com.sun.jersey.api.core.PackagesResourceConfig init
    INFO: Scanning for root resource and provider classes in the packages:
      sample.hello.resources

   com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Root resource classes found:
      class sample.hello.resources.HelloResource

   com.sun.jersey.api.core.ScanningResourceConfig init
    INFO: No provider classes found.

   com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
    INFO: Initiating Jersey application, version 'Jersey: 1.8 06/24/2011 12:17 PM'

当我访问该 URL 时,我得到一个 404。 http://localhost:8080/Jersey/rest/hello

代码:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHello() 
        return "Hello Jersey";
    
  

我在日志中没有看到任何其他异常

【问题讨论】:

如果您同时发布 web.xml 和 sample.hello.resources.HelloResource 类将会有所帮助。 在您的日志中对我来说这些看起来不像例外,只是信息性消息。该 IBM 教程介绍了有关使用 Eclipse 创建名为 Jersey 的 Web 应用程序的内容。我不熟悉通过 Eclipse 部署到 Tomcat,但您确定 Jersey 是正确的部署路径吗?也就是说,您是否尝试过浏览到localhost:8080/rest/hello? 上下文路径不会像 Eclipse 项目名称那样更改。您可以通过在 Eclipse Server 视图中深入研究 Tomcat 的项目树来轻松调查此问题。但是可以在 Web 项目设置选项卡上更改项目属性中的上下文路径。但是路径应该是“localhost:port/[Eclipse项目名称]/rest/hello @Path 不应该是“/rest/hello”吗?我永远不知道,只是将 servlet 映射到 /* :-) 我不认为“未找到提供程序类”是一个致命问题,或者与实际 API 请求的 404 有关。 【参考方案1】:

此问题已解决如下。我的本地主机已经设置了“Apache”网络服务器,它将所有请求重定向到 Tomcat。由于“Jersey”正在使用一个新的 servlet,我必须专门为这个 servlet 创建一个单独的重定向。

在 Linux 中

/etc/apache2/apache2.conf

添加:

JkMount /rest/* ajp13_worker

【讨论】:

您确定这是由于 httpd 造成的吗?毕竟,您访问的是localhost:8080/Jersey/rest/hello,这意味着 apache2 没有重定向,您正在直接访问 tomcat。您能否回复一下,因为我遇到了同样的 404 错误,而且我根本没有运行 httpd。【参考方案2】:

默认情况下,除非在 catalina_home/conf/server.xml、catalina_home/conf/context.xml 或应用程序的 META-INF/ context.xml 文件。

要访问http://localhost:8080/Jersey/rest/hello,上下文条目应为&lt;Context path="/Jersey" docBase="myapp"/&gt;,您的资源应具有@Path("/rest/hello")

【讨论】:

您那里的@Path 注释不正确。 Path 指定的路径相对于 servlet 上下文的名称和 servlet 映射。您的 Path 注释本质上将映射到 localhost:8080/Jersey/rest/rest/hello。【参考方案3】:

验证您的网址是否正确:

tomcat 管理器应用程序很乐意将您定向到 servlet 的根 URL。 (您假设这是带有大写 J 的“泽西岛”。) http://localhost:8080/manager/html/list

然后您可以通过将 web.xml 的 servlet 映射中的 URL 模式设置为“/*”来跳过“rest”部分(是的,Jersey 中有一个与此相关的错误,但那是古老的历史)

然后您可以附加“application.wadl”来获取可用资源的描述。理论上: http://localhost:8080/Jersey/application.wadl

【讨论】:

以上是关于Java Jersey Rest:未找到提供程序类。 (访问 URL 时出现 404 错误)的主要内容,如果未能解决你的问题,请参考以下文章

找不到提供程序类:运行Jersey REST服务时

使用Eclipse和Payara服务器的Jersey REST应用程序找不到HTTP状态404

Jersey Rest服务类型

Jersey REST 服务上的用户身份验证

Jersey ExceptionMapper未被调用

未找到 Neo4j Cypher Java Jersey 消息正文编写器