Wystąpienie ResourceConfig nie zawiera żadnych głównych klas zasobów

79

Co tu się dzieje?

The ResourceConfig instance does not contain any root resource classes.
Dec 10, 2010 10:21:24 AM com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate
SEVERE: Exception occurred when intialization
com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
        at com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:103)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1182)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.access$600(WebApplicationImpl.java:161)
        at com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:698)
        at com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:695)
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:197)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:695)
        at com.sun.jersey.spi.spring.container.servlet.SpringServlet.initiate(SpringServlet.java:117)

Filtr:

<filter>
    <filter-name>JerseyFilter</filter-name>
    <filter-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</filter-class>

    <init-param>
        <param-name>com.sun.jersey.config.feature.Redirect</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/views/</param-value>
    </init-param>

    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <param-value>/(images|css|jsp)/.*</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>JerseyFilter</filter-name>
    <url-pattern>/myresource/*</url-pattern>
</filter-mapping>

Kod:

@Path ("/admin")
public class AdminUiResource {

  @GET
  @Produces ("text/html")
  @Path ("/singup")
  public Viewable getSignUp () {
    return new Viewable("/public/signup", "Test");
  }
}
cmani
źródło
Czy "/singup"zamiast "/signup"mieć tu jakiś efekt?
Ken Williams
to musi być serwlet, a nie filtr
Emre Türkiş
sprawdź, czy nazwa pakietu i inne parametry są poprawne.
Gaurav

Odpowiedzi:

82

Czy próbowałeś dodać

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>my.package.name</param-value>
</init-param>

do Twojej definicji SpringServlet? Oczywiście zamień my.package.name na pakiet, w którym znajduje się AdminUiResource, i upewnij się, że znajduje się on w ścieżce klas.

Mikrofon
źródło
3
Dla osób, które nie używają Springa: musisz dodać to init-paramdo com.sun.jersey.spi.container.servlet.ServletContainerserwletu.
zb226
33

Jestem nowy na Jersey - miałem ten sam problem, ale kiedy usunąłem „/” i po prostu użyłem @path („admin”), zadziałało.

@Path("admin")
public class AdminUiResource { ... }
Anver Sadhat
źródło
Używam Spring JAX-RS, Jersey. To rozwiązanie działa dobrze dla mnie.
Niedziela,
30

MUSISZ DODAĆ NAZWĘ PAKIETU NA STRONIE

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>your.package.name</param-value>
</init-param>

TAKŻE GŁUPA RZECZY, KTÓRE ZWRÓCIŁEM SIĘ,
Muszę odświeżyć projekt po MAVEN BUILD, bo inaczej pokazuje mi ten sam błąd.
Proszę o komentarz Jeśli wiesz, dlaczego musimy odświeżyć projekt?

VdeX
źródło
2
Rządzisz! Działało poprawnie, gdy odświeżam projekt po instalacji Maven! Dzięki. :)
Mahan
2
@Tmp dzięki, to naprawdę dziwne. Po odświeżeniu działa dobrze. Plus jeden za hakowanie
Arun
28

Oznacza to, że nie mógł znaleźć żadnej klasy, która może być wykonana jako usługa sieciowa RESTful koszulki.

Czek:

  • Czy com.sun.jersey.config.property.packagesw pliku web.xml brakuje elementu „”.
  • Brak wartości com.sun.jersey.config.property.packagesparametru „ ” lub jest on nieprawidłowy (wspomniany pakiet nie istnieje). Powinien to być pakiet, w którym umieściłeś swoje klasy POJO, które działają jako usługi koszulki.
  • Czy istnieje przynajmniej jedna klasa POJO, która ma metodę z adnotacją z @Pathatrybutem.
Pawan
źródło
Z jakiegoś powodu miałem tę właściwość o nazwie jersey.config.server.provider.packages i działała pod Glassfish. Po zmianie nazwy działa również w Jetty.
Odyseusz
3
Kilka wierszy w moim pliku konfiguracyjnym odnosiło się do pustego katalogu, który powodował ten błąd. <servlet> <servlet-name>Jersey Web Services</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <!-- <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> -------><param-value>package.without.any.webservices</param-value> </init-param> --> <load-on-startup>1</load-on-startup> </servlet>
Nielsvh
12

Twój pakiet zasobów powinna zawierać co najmniej jeden POJO który jest albo z uwagami @Pathlub mają co najmniej jedną metodę z uwagami @Pathlub żądanie desygnatorze metody, takie jak @GET, @PUT, @POST, lub @DELETE. Metody zasobów to metody klasy zasobów z adnotacją z oznaczeniem metody żądania. To rozwiązało mój problem ...

hakish
źródło
11

Natknąłem się na ten problem z JBOSS EAP 6.1. Udało mi się wdrożyć kod przez eclipse na serwerze JBOSS, ale gdy próbowałem wdrożyć plik jako plik WAR w JBOSS, zacząłem otrzymywać ten błąd.

Rozwiązaniem było skonfigurowanie pliku web.xml do poprawnej współpracy z JBOSS poprzez umożliwienie im współpracy.

Poniższe dwie linie zostały zakomentowane w pliku web.xml, aby umożliwić JBOSS wykonywanie własnych konfiguracji

<!--  
    <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.your.package</param-value>
</init-param> -->

A następnie dodaj następujące parametry kontekstu po

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
Antman06
źródło
3
Ta sugestia zadziałała dla mnie w Wildfly 8.1. Nie musiałem jednak dodawać <context-param/>sekcji. Musiałem tylko usunąć <param-name>com.sun.jersey.config.property.packages</param-name> <init-param/>sekcję.
Donovan Muller
3
Dla mnie to samo. Wystarczy skomentować / usunąć <init-param>naprawiony problem w Wildly 8.2.0; Jednak miałem inne problemy, takie jak aplikacja, którą wdrażałem, nie działała z Jersey na Wildly. Jersey (używany przez GlassFish) i RestEasy (używany przez Wildfly) mają różne konfiguracje.
lantrix
2
Walczyłem przez kilka godzin. To naprawdę mi pomogło!
blaa
10

Zasadniczo poprawiłem to jak poniżej i wszystko działało dobrze.

<servlet>
    <servlet-name >MyWebApplication</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.feature.Redirect</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/views/</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <param-value>/(images|css|jsp)/.*</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>MyWebApplication</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>
cmani
źródło
9

Otrzymuję ten wyjątek z powodu braku elementu ResourseConfig w pliku Web.xml.

Dodaj:

<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>/* Name of Package where your service class exists */</param-value>
</init-param>

Klasa usług oznacza: klasę, która zawiera usługi takie jak: @Path("/orders")

TechSunil
źródło
7

Miałem ten sam problem z próbą uruchomienia aplikacji internetowej z projektu zaćmienia. Jak tylko skopiowałem pliki .class /WEB-INF/classes, działało idealnie.

Rodrigo Asensio
źródło
tak… masz rację ... Z powodu błędu w moim kodzie java pliki klas nie są poprawnie generowane. Stąd powyższy błąd wystąpił u mnie .. Naprawiono te błędy java, wyczyściłem kod i nowa klasa została wygenerowana. Po wygenerowaniu pliku zajęć powyższy błąd został naprawiony. Dziękuję Rodrigo Asensio ..
więc musisz skonfigurować to tak, aby skompilowane pliki .class tam trafiały? To dziwne, że zaćmienie lub coś nie robi tego automatycznie
Dukeatcoding,
6

Miałem ten sam problem, testując kilka różnych przykładów i wypróbowałem wszystkie możliwe rozwiązania. To, co w końcu @Path("")sprawiło, że zadziałało dla mnie, to kiedy dodałem linię ponad klasową, pominąłem to.

Holstadius
źródło
5

Miałem ten sam problem i okazało się, że jest to problem związany ze sposobem wdrażania kodu źródłowego. Jako komunikat o błędzie mówi: "...does not contain any root resource classes". Dlatego nie mógł znaleźć żadnych klas zasobów w skonfigurowanym pakiecie. Po prostu źle rozmieściłem klasy - dlatego ich nie odebrałem.

Zapomniałem wdrożyć pliki moich klas w katalogu / WEB-INF / classes w WAR - początkowo miałem je bezpośrednio w katalogu głównym pliku WAR. Więc kiedy szukał klas zasobów, nie znalazł ich - ponieważ istniały w innej (niewłaściwej) lokalizacji.

NS du Toit
źródło
4

Ten sam problem - plik web.xml wyglądał tak:

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mystuff.web.JerseyApplication</param-value>
    </init-param>
...

Udostępnienie aplikacji niestandardowej zastępuje wszelkie skonfigurowane w XML automatyczne wykrywanie klas. Musisz zaimplementować odpowiednie metody, aby napisać własny kod, aby połączyć klasy. Zobacz javadocs.

Dustin Getz
źródło
3

Inną możliwą przyczyną tego błędu jest to, że zapomniałeś dodać biblioteki, które są już w /WEBINF/libfolderze do ścieżki budowania (np. Podczas importowania .war-pliku i nie sprawdzania bibliotek, gdy zostaniesz o to poproszony w kreatorze). Po prostu mi się przydarzyło.

bmurauer
źródło
3

Zdarzyło mi się to, gdy wdrożyłem plik main.jar, bez zaznaczania pola dodawania wpisów katalogu w menu eksportu jar w Eclipse .

serj
źródło
2

Cóż, trochę za późno na odpowiedź. Napotkałem ten sam problem i moje wyszukiwania w Google poszły na marne. Jednak udało mi się znaleźć problem. Może istnieć wiele powodów, dla których pojawia się ten błąd, ale otrzymałem błąd z następujących powodów i chciałem się nim podzielić z innymi programistami.

  1. Wcześniej używałem Jersey 1.3 i otrzymywałem ten błąd. Ale kiedy zaktualizowałem słoiki do najnowszej wersji Jersey, problem został rozwiązany.
  2. Innym przypadkiem, w którym otrzymałem ten błąd, była próba wdrożenia mojej usługi w JBoss poprzez utworzenie pliku wojny. Popełniłem błąd, dołączając pliki Java do .war zamiast klas Java.
Nikhil
źródło
2

Musiałem dodać końcowy ukośnik na końcu @path

@Path ("/admin/") 
MobileMon
źródło
2

Ok ... Dla mnie działa dobrze, po prostu przypisując "klasę serwletu" do com.sum.jersey.spi.container.servlet.ServletContainer, używam IDE (Eclipse Mars)

<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/frontend/*</url-pattern>
    </servlet-mapping>

ale z jakiegoś powodu musiałem zrestartować komputer, aby pracować na moim lokalnym hoście. Jeśli nadal nie działa? Musisz dodać ten kod w swoim web.xml pomiędzy tagiem "servlet".

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>the.package.name</param-value>
</init-param>

„the.package.name” to nazwa pakietu, w którym znajdują się Twoje klasy. Jeśli używasz IDE, odśwież projekt i uruchom ponownie w Tomcat. nadal nie działa? uruchom ponownie komputer i będzie działać.

user3945851
źródło
2

Kolejną rzeczą do sprawdzenia jest kombinacja poprzednich wpisów

Możesz mieć w swoim pliku web.xml to:

<init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.acme.rest</param-value>
</init-param>

i możesz mieć

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>

ale nie możesz mieć obu lub otrzymujesz tego rodzaju błąd. Rozwiązaniem w tym przypadku byłoby skomentowanie jednego lub drugiego (prawdopodobnie pierwszy fragment kodu zostałby wykomentowany)

demongolem
źródło
1

tak, dodanie parametru inicjalizacji dla com.sun.jersey.config.property.packages rozwiązało ten problem.

łączył usługi odpoczynku koszulki z aplikacją wiosenną opartą na Maven i otrzymałem ten błąd.

Harinath
źródło
1

Otrzymałem też tego rodzaju błąd, proszę zająć się konfiguracjami w xml.

napisałem com.sun.jersey.comfig.property.packages

Zamiast com.sun.jersey.config.property.packages

Po korekcie działa.

Ravi Thapa
źródło
1

ten problem jest spowodowany tym, że jersey nie może znaleźć pakietu zależności dla deklarowanej usługi odpoczynku

Sprawdź dystrybucję pakietu projektu i upewnij się, że jest równa wartości parametru web.xml

Jose Luis Garcia
źródło
1

Prawdopodobnie za późno, ale tak rozwiązałem ten błąd.

Jeśli to rozwiązanie nie działa,

<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>/* Name of Package where your service class exists */</param-value>
</init-param>

W zaćmieniu:

Kliknij prawym przyciskiem myszy swój projekt lub wybierz projekt i naciśnij Alt + Enter Po lewej stronie otwartego okna znajdź ścieżkę budowania Java

Wybierz Biblioteki z prawego panelu zakładek: Jeśli jest coś, co jest uszkodzone lub ma krzyżyk na górze słoików, usuń i dodaj ponownie ten sam słoik

Zastosuj i zamknij

Odbuduj swój projekt

Sufiyan Ansari
źródło
0

W moim przypadku dwukrotnie dodałem słoiki w ścieżce kompilacji po zaimportowaniu z wojny. Działało dobrze po usunięciu dodatkowych plików JAR, które wyświetlały strony błędów deskryptora wdrażania błędów

dodanie

<init-param>
          <param-name>com.sun.jersey.config.property.packages</param-name>
          <param-value>service.package.name</param-value>
</init-param>
Hema
źródło
0

Również dwukrotnie z różnych powodów napotkaliśmy ten problem. Za pierwszym razem zapomniałem dołączyć

<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>my.package.name</param-value>
</init-param>

jak opisano w poprzednich komentarzach, a kiedy to zrobiłem, zaczęło działać.

Jednak ... innego dnia zacząłem Eclipse, spodziewając się kontynuować od miejsca, w którym przerwałem, i zamiast działać, mój program ponownie pokazał ten sam błąd. Zacząłem sprawdzać, czy przypadkowo nie dokonałem jakichś zmian i zapisałem uszkodzony plik, ale nie mogłem znaleźć takiego błędu i plik wyglądał dokładnie tak, jak przykłady, które mam, wszystko w porządku. Ponieważ zadziałało dzień wcześniej, po wstępnych poszukiwaniach pomyślałem, że może to usterka Eclipse, Tomcat lub coś w tym rodzaju, więc po prostu spróbujmy wprowadzić jakieś zmiany i zobaczmy, czy zareaguje. Zrobiłem więc spację + backspace w pliku web.xml, aby oszukać Eclipse, że plik został zmieniony, i wtedy go zapisałem. Następnym krokiem było ponowne uruchomienie serwera Tomcat (z Eclipse IDE) i voila, znowu działa!

Może ktoś z większym doświadczeniem mógłby wyjaśnić, na czym tak naprawdę polega problem?

Gishas
źródło
-1

Główną przyczyną tego wyjątku jest:

Nie podałeś poprawnej nazwy pakietu, jeśli używasz @Pathlub zapomniałeś skonfigurować w pliku web.xml / Configuration (nazwa pakietu klasy Rest API, nazwa pakietu Twojej klasy)

Sprawdź tę konfigurację w środku <init-param>

Abhijit Patra
źródło
@jfeferman To ewidentnie próba udzielenia odpowiedzi na pytanie. Zachowaj większą ostrożność podczas przeglądania w kolejce LQP.
TylerH,