Джерси 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 важным сообщением?
Ответы
Ответ 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;
}
//...
}