Нет идеи, почему: экземпляр ResourceConfig не содержит классов корневого ресурса

Я новичок в jersey и веб-сервисах, и я пытаюсь запустить простой веб-сервис RESTful. Я следил за 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, и я не знаю, почему я получил эту ошибку, я буду очень признателен, если кто-нибудь знает, в чем проблема

Ответ 1

Ошибка:

com.sun.jersey.api.container.ContainerException: экземпляр ResourceConfig не содержит классов ресурсов root.

означает, что Джерси не может найти классы обслуживания. Это может быть вызвано неправильным именем пакета для параметра com.sun.jersey.config.property.packages или если имя пакета верное, но оно не содержит классов ресурсов (люди иногда забывают добавить аннотацию @Path в классе).

Но я не могу найти ничего плохого в вашей настройке. Так что это должно сработать!

Убедитесь, что ваше приложение развернуто правильно и что ваша папка WEB-INF/classes действительно содержит ваш класс с правильным каталогом для пакета.

Сделайте полную очистку и перестройте, затем повторите попытку.

Ответ 2

У меня нет реальной проблемы, с которой вы сталкиваетесь. Вы можете dwonload пример https://github.com/kdmalviyan/RestWithJerseyExample.git после загрузки вам необходимо предпринять следующие действия: 1. mvn clean install 2. Разверните войну на свой сервер 3. получить доступ к "JerseyExample-0.0.1-SNAPSHOT/rest/hello/hello Kuldeep Singh" на вашем сервере

Вы получите результат, например: Джерси: hello Kuldeep Singh

Я предлагаю вам следовать точным шагам без каких-либо изменений. Если вы получите правильный результат, вы можете изменить его в соответствии с вашими потребностями. Убедитесь, что вы переименовываете пакет, переименовываете пакет в web.xml тоже.

Ответ 3

Я просто столкнулся с этой проблемой, используя 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);

Ответ 4

Я столкнулся с этой проблемой. Было две вещи, которые я сделал, чтобы заставить ее работать, причем первая из них не связана с этой проблемой.

Во-первых, я использую майку 1.19. Однако я не понимал, что есть файл с именем javax.ws.rs-api-2.0.jar в WEB-INF/lib на сервере. Этот файл был добавлен два года назад, и IIRC работает совместно с джерси 2.x, но не 1.x. Я фактически удалил файл (переименовал его с расширением .bak в качестве расширения).

Во-вторых, я создал JAR файл в Eclipse для веб-службы. Я не использовал Maven или Ant или что-то в этом роде. Просто простой экспорт. Теперь ошибка может означать, что в вашем коде нет ничего, что ссылается на трикотаж. Но я написал простой тестовый класс, и все должно работать, подумал я. Оказывается, экспорт не создавал файл JAR должным образом. Я открыл JAR, и класс был пуст. Неудивительно, что это порождало эту ошибку! Я экспортировал еще раз и вместо checkmarking 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.

Ответ 5

Я сталкиваюсь с аналогичной проблемой. Проверьте процесс инициализации, правильно ли вы зарегистрировали класс 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!*****");
    }   
}

Ответ 6

Пожалуйста, убедитесь, что ваш пакет "com.sun.jersey.config.property.packages" зарегистрирован правильно в Web.xml... Удачи!!

  <servlet>
      <servlet-name>Jersey REST Service</servlet-name>
      <servletclass>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
     <param-name>com.sun.jersey.config.property.packages</param-name>
     <param-value>com.rest.service</param-value>
     </init-param>
     <init-param>
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
     <param-value>true</param-value>
     </init-param>         
     <load-on-startup>1</load-on-startup>
  </servlet>

Ответ 7

Если вы пытаетесь использовать HttpServerFactory, вы должны передать PackagesResourceConfig.

Пример:

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

Ответ 8

У меня была та же проблема, которую я решил, указав BOTH пакет классов и полностью удалив загрузку при запуске, то есть:

<servlet>
    <servlet-name>my-servlet-name</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>my.package.name</param-value>
    </init-param>
    <!-- <load-on-startup>1</load-on-startup> -->
</servlet>

Я думаю, потому что у меня было более одного сервлета под одним и тем же пакетом, и Джерси не выбрал "root", который загрузился при запуске.

Ответ 9

Ну, ни один из вышеперечисленных ответов не работал у меня. Тем не менее, они заставили меня дважды проверить каждый шаг и имя пакета. Как сказал Богдан, в папке target/classes/ не было скомпилированных классов.

Убедитесь, что ваше приложение развернуто правильно и что ваша папка WEB-INF/classes действительно содержит ваш класс с правильным каталогом для пакета.

Мое решение - это просто очистка проекта и компиляция другого. Вместо того, чтобы просто идти за mvn war:war, я сделал:

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

Затем он скомпилировался и ошибка OP исчезла.