Подтвердить что ты не робот

Джерси REST Экземпляр ResourceConfig не содержит классов ресурсов root

Хотя это один древний вопрос, я все еще не могу найти ответ, чтобы сделать эту работу. Пожалуйста, исправьте, если вы обнаружите, что какое-либо из моих утверждений неверно.

У меня есть приложение Java Face и используйте REST для веб-служб. Я не думаю, что Лицо имеет какое-либо отношение к моей проблеме. Веб файл:

<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>

У меня есть еще несколько сервлетов в web.xml, поскольку это приложение Face с Trinidad и т.д.

В пакете 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, достаточно, чтобы идентифицировать себя как класс ресурсов.
Не говоря уже о всех других сложностях, я скомпилировал исходный код с Ant в Eclipse, и я получил эту ошибку в файле 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 в приложение WEB-INF/lib. Я сделал это, и он все еще не работал. Я нашел предложение немного странным, так как WEB-INF/lib - это место, где Eclipse будет устанавливать все библиотеки зависимостей из пути сборки. Это не место, где мы вручную размещаем библиотеки.

Некоторые объяснили, что эта ошибка имеет какое-то отношение к подключаемому модулю Java и тому, как была написана Джерси. Но это было много лет назад.

Может ли кто-нибудь объяснить мне, почему у меня такая проблема?

Followup: Хотя на веб-сайте REST класс ресурсов, определенный как классы ресурсов Root, представляет собой POJO (обычные старые объекты Java), которые либо аннотируются с помощью @Path, либо имеют хотя бы один метод, аннотированный с помощью @Path или указателем метода запроса, таким как @GET, @PUT, @POST или @DELETE. Методы ресурсов - это методы класса ресурсов, аннотированные с помощью указателя метода запроса. В этом разделе описывается использование Джерси для аннотирования объектов Java для создания веб-служб RESTful.

Мне нужно добавить @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 http://localhost:8080/nd/hello, и я все еще получаю 404 NOT FOUND. Является ли класс провайдера NOT FOUND важным сообщением?

4b9b3361

Ответ 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

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

У меня есть класс ресурсов root, на котором есть следующие аннотации:

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

Это приведет к сбою сканирования корневого ресурса в Джерси.

Исправление состоит в том, чтобы изменить порядок аннотаций:

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

Это работает.

Ответ 3

Во-первых, обратите внимание, что иметь @GET в классе недостаточно, чтобы идентифицировать его как класс ресурса root; класс должен иметь @Path. Ваш, так что не проблема.

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

Я использую встроенный Jetty, с main(), который выглядит так:

public static void main(String argv[])
{
    try
    {
        // from http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty
        Server server = new Server(8080);
        ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        contextHandler.setContextPath("/");
        server.setHandler(contextHandler);

        // http://stackoverflow.com/questions/9670363/how-do-i-programmatically-configure-jersey-to-use-jackson-for-json-deserializa
        final PackagesResourceConfig prc = new PackagesResourceConfig("com.ultimatefoodfight.server.api");
        final Map<String, Object> prcProperties = prc.getProperties();
        prcProperties.put(JSONConfiguration.FEATURE_POJO_MAPPING, true);

        // from http://stackoverflow.com/questions/7421574/embedded-jetty-with-jersey-or-resteasy
        contextHandler.addServlet(new ServletHolder(new ServletContainer(prc)), "/*");

        server.start();
        server.join();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }
}

(При встраивании Jetty это заменяет web.xml.) com.sun.jersey.api.core.PackagesResourceConfig проверяет именованные классы для классов корневого ресурса поставщика - я уверен, что web.xml просто указывая на то же самое. Это отлично работало в Eclipse. Администрирование сервера правильно сообщает об этом в консоли:

INFO: Scanning for root resource and provider classes in the packages:
  com.ultimatefoodfight.server.api
Jul 29, 2012 7:31:28 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class com.ultimatefoodfight.server.api.Users
  class com.ultimatefoodfight.server.api.Contests

Однако, когда я запускаю приложение на сервере, я получаю только первые две строки, и классы ресурсов Root не найдены.

Оказывается, когда вы делаете банку, существуют различные варианты ее построения; в частности, если вы просто сделаете это, указав пути к классам, вы получите просто эти записи. Но если вы укажете jar в каталоге с wild card, вы также получите все промежуточные пути. См. Это сообщение для примера, который опрокинул меня: https://groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ.

Класс PackagesResourceConfig зависит от наличия каталога с именем пакета, чтобы найти классы внутри него. Я вернулся в Eclipse и нашел вариант в нижней части диалогового окна "Экспорт... > Jar" для "Добавить записи в каталог". Я включил это, снова экспортировал банку, а затем сканирование обнаружило классы ресурсов. Вам нужно будет найти сопоставимый вариант в вашей среде сборки.

Ответ 4

Я только что провел с ним 5 или 6 часов, и наконец решил проблему. Возможно, это может сработать и для вас.

Исходный код, который я использовал, доступен на странице Lars Vogel. Используя Apache Tomcat 6.0.20, asm-all-3.3.1.jar, jersey-bundle-1.17.1.jar и jsr311-api-1.1.1.jar, я получал те же результаты, что и OP, т.е.

INFO: Root resource classes found:
  class com.mypackage.MyClass
13/03/2013 4:32:30 PM com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.

У меня были следующие настройки в разных файлах развертывания:

context root = rivets
<url-pattern>/rest</url-pattern>
@Path("/hello")

Попытка доступа к ресурсу с использованием следующего URL-адреса дала ошибку 404

 http://localhost:8080/rivets/rest/hello

В конце концов я смог исправить это, изменив url-шаблон на:

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

Хотя я не уверен, как это задержит, когда я начну вводить более сложные ресурсы. В любом случае, надеюсь, это может помочь кому-то.

Ответ 5

Я обнаружил, что сообщение "нет провайдеров" найдено пугающе, но не важно.

"Экземпляр ResourceConfig не содержит классов корневых ресурсов" - гораздо большая проблема.

Я обнаружил, что класс ресурса должен быть аннотирован с помощью @Path, а класс провайдера (если у вас есть один - мы используем его для отображения исключений для кодов ответа HTTP), необходимо аннотировать с помощью @Provider, и им необходимо чтобы быть в правильном пакете, а затем Джерси найдет их.

Ответ 6

вам может понадобиться URL-адрес, подобный этому

http://localhost:8080/<web_context_root>/nd/hello

Ответ 7

Итак, я прочитал ответы и все еще имел ту же проблему. Я решил это следующим образом.

Добавлено "jetty-web.xml" в папку "WEB-INF". Таким образом: SRC/Главный/WebApp/WEB-INF/web.xml причал-

Содержимое файла jetty-web.xml:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/YourEndpoint</Set>
</Configure>

Мой отдых теперь доступен по адресу:

http://localhost:8080/YourEndpoint/webresources/someMethod

Надеюсь, что это поможет кому-то там.

Ответ 8

У меня была та же проблема. Решил его, установив в web.xml значение param в элементе init-param. По умолчанию Eclipse установил в web.xml имя проекта в отображаемое имя. Это не должно быть скопировано в param-value, но в пакете Java.

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

Надеюсь, что это поможет.

Ответ 9

Чтобы устранить эту проблему, проверьте свой класс MapperIn, необходимо указать Path:

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

import com.lot.account.api.doc.GetMemberAccountsIn;
import com.lot.common.doc.CommonApi;
import com.lot.common.doc.FlowData;
import com.lot.security.authorization.RequestData;


@Path("/account/member/")
public class MapperIn {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/{memberId}")
    public GetAccountIn prepareGetAccount(@PathParam("memberId") String memberId) {

        // create apiInput
        GetAccountIn apiInput = new GetAccountIn ();

        // map values from url
            apiInput.setMemberId(memberId);


        return apiInput;
    }
//...
}