不知道为什么:ResourceConfig实例不包含任何根资源类

时间:2014-01-16 11:15:58

标签: java rest jersey

我是球衣和网络服务的新手,我尝试运行一个简单的RESTful Web服务。我跟着http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/,但我的项目没有使用maven,我下载了jersey.1.17.1.jar并将其包含在我的项目路径中。

当我想在http://localhost:8080/sycotext/rest/service/SOMETEXT上调用服务时,我收到此错误:

HTTP Status 500 - Servlet.init() for servlet sycoText-servlet threw exception

这是堆栈跟踪:

javax.servlet.ServletException: Servlet.init() for servlet sycoText-servlet threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:76)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:934)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:515)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1010)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1618)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1576)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:724)

root cause

com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
    com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99)
    com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1331)
    com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:168)
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:774)
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:770)
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:765)
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:489)
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:319)
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605)
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:76)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:934)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:515)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1010)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1618)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1576)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:724)

这是我的代码:

package ir.sycotech.text.server.service;

import javax.ws.rs.*;
import javax.ws.rs.core.Response;

@Path("/service")
public class SycoTextService {
    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {
        String output = "Jersey say : " + msg;
        return Response.status(200).entity(output).build();
   }

这是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Restful Web Application</display-name>


    <servlet>
        <servlet-name>sycoText-servlet</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>ir.sycotech.text.server.service</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>sycoText-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

我已经在web.xml文件中正确指定了我的包名,我不知道为什么会出现这个错误,如果有人知道是什么问题,我将非常感激

9 个答案:

答案 0 :(得分:27)

错误:

  

com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。

表示Jersey无法找到服务类。这可能是由com.sun.jersey.config.property.packages参数的错误命名包引起的,或者包名是否正确但是它不包含资源类(人们有时忘记在类上添加@Path注释)。 / p>

但我发现你的设置没有任何问题。所以这应该有效!

检查您的应用程序是否已正确部署,并且您的WEB-INF/classes文件夹实际上是否包含具有该软件包的正确文件夹路径的类。

完全清理并重建然后再试一次。

答案 1 :(得分:0)

我不是你面临的实际问题。 你可以下载一个例子https://github.com/kdmalviyan/RestWithJerseyExample.git 下载后你必须采取以下行动: 1. mvn clean install 2.将war部署到您的服务器 3.访问&#34; JerseyExample-0.0.1-SNAPSHOT / rest / hello / hello Kuldeep Singh&#34;在您的服务器上

你会得到如下的输出:泽西说:你好Kuldeep Singh

我建议您先按照确切的步骤进行任何更改。如果您得到正确的结果,那么您可以根据需要进行修改。请确保您是否重命名包,也在web.xml中重命名包。

答案 2 :(得分:0)

我刚刚使用Grizzly和球衣遇到了这个问题。

当您启动Grizzly容器时,您必须传递一张地图,告诉Grizzly在哪里可以找到您的资源。如果您像我一样从原型创建项目,或者只是移动了一些东西,那么您还必须更新这个容易被忽视的值。

    final static String YOUR_PACKAGE_NAME_GOES_HERE = "where.ever.your.resource.package.happens.to.be"

    final Map<String, String> initParams = new HashMap<String, String>();

    initParams.put("com.sun.jersey.config.property.packages",
            YOUR_PACKAGE_NAME_GOES_HERE);

    System.out.println("Starting grizzly...");
    SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams);

答案 3 :(得分:0)

我也遇到了这个问题。为了让它发挥作用,我做了两件事,第一件事与这个问题无关。

首先,我正在使用球衣1.19。但是,我没有意识到有一个名为的文件 服务器上javax.ws.rs-api-2.0.jar中的WEB-INF/lib。这个文件是在两年前添加的,IIRC与jersey 2.x一起使用,但不是1.x.我有效地删除了该文件(将其重命名为 .bak 作为其扩展名)。

其次,我在Eclipse中为Web服务创建了一个JAR文件。我没有使用Maven或Ant或类似的东西。只是一个简单的出口。现在,错误可能意味着您的代码中没有任何引用球衣的内容。但是我想,我写了一个简单的测试类,一切都应该正常工作。原来导出没有正确创建JAR文件。我打开JAR,课程是空的。难怪它产生了这个错误!我再次导出,而不是勾选Export generated class files and resources,我勾选了Export all output folders for checked projects。我在这个项目中也有多个包,这可能与导出无法正常运行的原因有关。一旦我做到了,它就有效了!

我再次尝试导出,但这一次,我勾选了Export generated class files and resources并选择了项目中的每个资源。与上次不同的是我选择.settings。上次未选择.settings。同样,这也有效!

我希望这可以帮助那些有类似问题的人。有时,它只是像确认你的JAR文件是正确的一样愚蠢。我使用java decompiler来检查JAR文件。

答案 4 :(得分:0)

我遇到类似的问题。请检查您的初始化过程是否已正确注册api类。

在您的情况下,初始化类是ir.sycotech.text.server.service

您需要在服务中注册所有api类。

以下是我的例子:

如果未注册以下类,我将遇到错误,(register(CtoFService.class);             寄存器(FtoCService.class);             寄存器(TriggerCmd.class))

    *<init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>my.mimos.hcserver.init.MyApplication</param-value>
    </init-param>*



 @ApplicationPath("/HCRestServer/")
public class MyApplication extends ResourceConfig{
    public MyApplication() {
        System.out.println("******Started!*****");
        register(CtoFService.class);
        register(FtoCService.class);
        register(TriggerCmd.class);
        register(CORSResponseFilter.class);
        System.out.println("******Done registration!*****");
    }   
}

答案 5 :(得分:0)

请确保您的软件包“com.sun.jersey.config.property.packages”在Web.xml中正确注册...祝您好运!

request.getParameter("action")=="delete"

答案 6 :(得分:0)

如果您尝试使用HttpServerFactory,则必须传递PackagesResourceConfig。

示例:

ResourceConfig rc = new PackagesResourceConfig("com.package");
HttpServerFactory.create(getBaseURI(), rc);

答案 7 :(得分:0)

我遇到了同样的问题,我通过指定类包和完全删除 load-on-startup 解决了这个问题,即:

public abstract class BaseNotificationHandlerActivity extends AppCompatActivity {

 protected int activityFlag = 0; // set a unique value from each extending Activity
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
}

 @Override
 public void onStart(){
  super.onStart();
  EventBus.getDefault().register(this);
}

  @Override
  public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
 }

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(NotificationItem notif) {
  if(activityFlag == 1){ 
   // this means Starting Activity, so handle for it particularly
       NotificationHelper notifHelper = new NotificationHelper(this);
       notifHelper.AddNotificationItem(notif);
   }
  else if(activityFlag ==2){
    // for some other Activity
    }

  }
}


public class StartingActivity extends BaseNotificationHandlerActivity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_starting);
  activityFlag = 1; // add unique flag for Activity here
}

 @Override
 public void onResume() {
 super.onResume();
}

我想是因为我在同一个软件包下有多个servlet而且Jersey coudn没有选择&#34; root&#34;一个在启动时加载。

答案 8 :(得分:0)

嗯,以上答案都不适合我。不过,他们让我仔细检查每一步和包名。正如Bogdan所说,target/classes/文件夹中没有编译过的类。

  

检查您的应用程序是否正确部署,以及您的WEB-INF / classes文件夹实际上是否包含具有该软件包的正确文件夹路径的类。

我的解决方案只是清理项目并编译不同的内容。我没有去mvn war:war,而是去了:

$ mvn clean:clean $ mvn compile $ mvn war:war

然后编译得很好,OP错误就消失了。