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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25988851/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 09:06:03  来源:igfitidea点击:

No provider classes found: when running Jersey REST service

javarestjerseyjax-rs

提问by Sajeetharan

I am very new to Java, and i have followed a tutorial to create an JAX-RS service, everything i did was according to the tutorial, but cannot get it to work. I have attached the screen shot and logs.

我对 Java 非常陌生,我按照教程创建了 JAX-RS 服务,我所做的一切都是根据教程进行的,但无法使其正常工作。我附上了屏幕截图和日志。

enter image description here

在此处输入图片说明

WEB.XML

网页.XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>com.duo.test</display-name>
 <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>com.duo.test</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>Jersey Rest Service</servlet-name>
      <url-pattern>/api/*</url-pattern>
  </servlet-mapping>  
</web-app>

MY class:

我的课:

package com.duo.test.status;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/v1/status/*")
public class V1_status {
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String returnTitle()
    {
    return "<p> Java Web Serbice</p>";  
    }

}

Logs:

日志:

Sep 23, 2014 12:22:56 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre7\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x64;C:\Program Files\Microsoft\Web Platform Installer\;D:\ndk;C:\ant\;C:\Program Files\Java\jdk1.7.0_07\bin;D:\Softwares\Ecclipse\Ecclipse\sdk\build-tools.1.0;C:\Program Files (x86)\Windows Kits.0\Windows Performance Toolkit\;C:\Program Files (x86)\Windows Kits.1\Windows Performance Toolkit\;C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin;C:\Program Files (x86)\GtkSharp.12\bin;C:\Takipi\lib;C:\Takipi\lib32;C:\Program Files (x86)\Microsoft SDKs\TypeScript.0\;C:\Program Files (x86)\nodejs\;JAVA_HOME%\bin;C:\apache-ant-1.9.4\bin;C:\adt-bundle\sdk\platform-tools;C:\adt-bundle\sdk\tools;;C:\Program Files (x86)\Java\jdk1.6.0_39\bin;C:\Users\sajeetharan.DUOSL.000\AppData\Local\Android\android-sdk\tools;C:\Users\sajeetharan.DUOSL.000\AppData\Local\Android\android-sdk\platform-tools;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x64;C:\Program Files\Microsoft\Web Platform Installer\;D:\ndk;C:\ant\;C:\Program Files\Java\jdk1.7.0_07\bin;D:\Softwares\Ecclipse\Ecclipse\sdk\build-tools.1.0;C:\Program Files (x86)\Windows Kits.0\Windows Performance Toolkit\;C:\Program Files (x86)\Windows Kits.1\Windows Performance Toolkit\;C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin;C:\Program Files (x86)\GtkSharp.12\bin;C:\Takipi\lib;C:\Takipi\lib32;C:\Program Files (x86)\Microsoft SDKs\TypeScript.0\;C:\Program Files (x86)\nodejs\;JAVA_HOME%\bin;C:\apache-ant-1.9.4\bin;C:\adt-bundle\sdk\platform-tools;C:\adt-bundle\sdk\tools;;C:\Program Files (x86)\Java\jdk1.6.0_39\bin;C:\Users\sajeetharan.DUOSL.000\AppData\Local\Android\android-sdk\tools;C:\Users\sajeetharan.DUOSL.000\AppData\Local\Android\android-sdk\platform-tools;C:\Program Files\Microsoft SQL Server0\Tools\Binn\tools;C:\apache-ant-1.9.4\bin;C:\adt-bundle\sdk\tools;C:\adt-bundle\sdk\platform-tools;c:\users\sajeetharan.DUOSL.000\AppData\Roaming\npm\;.
Sep 23, 2014 12:22:57 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:com.duo.test' did not find a matching property.
Sep 23, 2014 12:22:57 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Sep 23, 2014 12:22:57 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Sep 23, 2014 12:22:57 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Sep 23, 2014 12:22:57 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Sep 23, 2014 12:22:57 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2349 ms
Sep 23, 2014 12:22:58 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Sep 23, 2014 12:22:58 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.12
Sep 23, 2014 12:23:01 PM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  com.duo.test
Sep 23, 2014 12:23:01 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.duo.test.status.V1_status
Sep 23, 2014 12:23:01 PM com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
Sep 23, 2014 12:23:01 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.17 01/17/2013 03:31 PM'
[2014-09-23 12:23:03 TAKIPI] User code detected.
Sep 23, 2014 12:23:04 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Sep 23, 2014 12:23:04 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Sep 23, 2014 12:23:04 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 6653 ms

OUTPUT:enter image description here

输出:在此处输入图片说明

采纳答案by Amit Kaneria

One of the issue, I found with error

问题之一,我发现错误

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

is using Lambda expressions(Java 8) in Rest service class. Jersey fails to scan the annotations, if Lambdas are used in the package specified in web.xml file below:

在 Rest 服务类中使用 Lambda 表达式(Java 8)。如果在以下 web.xml 文件中指定的包中使用了 Lambda,Jersey 将无法扫描注释:

  <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.duo.test</param-value>
  </init-param>

Solution for this problem is to remove Lambda in any class in the package specified.

此问题的解决方案是删除指定包中任何类中的 Lambda。

NOTE:This may be only a problem with Jersey 1.x, I have not tried using Jersey 2.x yet. Removing Lambda has helped me work around the issue temporarily.

注意:这可能只是 Jersey 1.x 的问题,我还没有尝试使用 Jersey 2.x。删除 Lambda 帮助我暂时解决了这个问题。

回答by Abimaran Kugathasan

URL Mapping was wrong, it should be

URL Mapping 错了,应该是

<servlet-mapping>
      <servlet-name>Jersey Rest Service</servlet-name>
      <url-pattern>/v1/*</url-pattern>
</servlet-mapping>

And acording to your configurations, API URL should be http://localhost:8080/v1/status/

根据您的配置,API URL 应该是 http://localhost:8080/v1/status/

Or

或者

Change your URI Mapping in in Service class like

在 Service 类中更改您的 URI 映射,例如

package com.duo.test.status;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/api/*")
public class V1_status {
    @GET
    @Produces(MediaType.TEXT_HTML)
    @Path("/v1/status/")
    public String returnTitle()
    {
    return "<p> Java Web Serbice</p>";  
    }

}

回答by rogerdpack

It seems when I ran into this it was upgrading jersey from 1.0.2 to 1.1x and the logs would say

似乎当我遇到这个时,它正在将球衣从 1.0.2 升级到 1.1x 并且日志会说

INFO: Root resource classes found:
  class org.x.y.MyClass
No provider classes found.

And then everything would be a 404, even though it says that the webapp successfully deployed, couldn't get to it at all.

然后一切都将是 404,即使它说 webapp 成功部署,也根本无法获得它。

Turns out that my

原来我的

<servlet-mapping>
<servlet-name>Webapp Human name</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

in web.xmlis no longer good enough for the new version of jersey, it needs to be

inweb.xml对于新版本的球衣来说已经不够好了,它需要

<url-pattern>/*</url-pattern>

<url-pattern>/*</url-pattern>

ref: http://jersey.576304.n2.nabble.com/Jersey-and-url-pattern-td4548025.html

参考:http: //jersey.576304.n2.nabble.com/Jersey-and-url-pattern-td4548025.html