web-dev-qa-db-ja.com

Jersey REST ResourceConfigインスタンスにはルートリソースクラスが含まれていません

これは古代の質問の1つですが、この作品を作成するための答えがまだ見つかりません。あなたが私の声明のいずれかが正しくないと思う場合は修正してください。

Java Faceアプリを使用しており、WebサービスにRESTを使用しています。 Faceは私の問題とはまったく関係ないと思います。 web.xmlは次のとおりです。

<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アプリがあるため、かなり多くのサーブレットがあります。

パッケージ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があるという事実は、それ自体がリソースクラスであることを識別するのに十分です。
他のすべての複雑さは言うまでもなく、EclipseでAntを使用してソースコードをコンパイルすると、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プラグインとJerseyの記述方法に関係があると説明する人もいました。しかし、それは何年も前のことです。

なぜ誰かがこの問題を抱えているのか説明してもらえますか?

フォローアップ:REST Webサイトからですが、ルートリソースクラスとして定義されるリソースクラスは、@ Pathアノテーションが付けられているか、少なくとも1つのメソッドが付けられているPOJO(Plain Old Javaオブジェクト)です。 @Path、または@ GET、@ PUT、@ POST、@ DELETEなどの要求メソッド指定子。リソースメソッドは、リクエストメソッド指定子で注釈が付けられたリソースクラスのメソッドです。このセクションでは、Jerseyを使用してJavaオブジェクトに注釈を付けてRESTful Webサービスを作成する方法について説明します。

クラスに@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が表示されます。 Providerクラスは重要なメッセージではありませんか?

20
user759646

同じエラーメッセージが表示され、web.xmlファイルを変更して解決しました。これが含まれていることを確認してください:

<init-param>
   <param-name>com.Sun.jersey.config.property.packages</param-name>
   <param-value>your.package.name.here</param-value>
</init-param>
11
Conor Pender

Jerseyがルートリソースを見つけられなかった別の理由を見つけました。エラーメッセージは同じなので、他の人がつまずいた場合に備えて、ここに根本原因を文書化するのが良い理由だと思いました。

次の注釈が付いたルートリソースクラスがあります。

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

これにより、ジャージー内のルートリソーススキャンが失敗します。

修正は、注釈の順序を変更することです。

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

これは動作します。

7
Tero Paananen

まず、クラスで@GETを使用しても、ルートリソースクラスとして識別するには十分ではないことに注意してください。クラスには@Pathが必要です。あなたがするので、それは問題ではありません。

私はあなたと同じ問題を抱えていました。Eclipseで動作しましたが、外部で使用するために構築したときは動作しませんでした。

次のようなmain()を使用して、組み込みのJettyを使用しています。

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

ただし、サーバーでアプリケーションを起動すると、最初の2行しか取得できず、ルートリソースクラスが見つかりません。

Jarを作成する場合、作成方法にはさまざまなオプションがあります。特に、クラスへのパスをリストして作成した場合、それらのエントリのみを取得します。しかし、ワイルドカードを使用してjarをディレクトリにポイントすると、すべての中間パスも取得されます。 https://groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ の例については、このメッセージを参照してください。

PackagesResourceConfigクラスは、パッケージ内のクラスを見つけるために、パッケージの名前を持つディレクトリを持つことに依存しています。 Eclipseに戻り、「エクスポート...> Jar」ダイアログの下部に「ディレクトリエントリの追加」オプションが見つかりました。私はそれをオンにし、jarを再度エクスポートしました。その後、スキャンによってリソースクラスが見つかりました。ビルド環境で同等のオプションを見つける必要があります。

5
Chris Westin

私もこれで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-patternを次のように変更することで修正できました:

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

より複雑なリソースを紹介し始めたときに、これがどのように持続するかはわかりませんが。とにかく、うまくいけばこれが誰かを助けるかもしれない。

3
Dave Durbin

「プロバイダークラスが見つかりません」というメッセージは怖いですが重要ではないことがわかりました。

「ResourceConfigインスタンスにはルートリソースクラスが含まれていません」は、はるかに大きな問題です。

リソースクラスに@Pathアノテーションを付ける必要があり、プロバイダークラス(ある場合は例外をHTTP応答コードにマッピングするために使用します)に@Providerアノテーションを付ける必要があり、両方とも適切なパッケージ、そしてジャージーはそれらを見つけます。

2
metamatt

あなたはこのようなURLを使用する必要があるかもしれません

http://localhost:8080/<web_context_root>/nd/hello
1
Alex Curvers

この問題を解決するには、クラスMapperInを確認してください。パスを指定する必要があります。

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;
    }
//...
}
0
Sylwester Z

同じ問題がありました。 web.xmlでinit-paramタグの下のparam-valueを修正することで解決しました。デフォルトでは、Eclipseはweb.xmlでプロジェクトの名前をdisplay-nameに設定していました。これはparam-valueにはコピーされませんが、Javaパッケージにコピーされます。

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

お役に立てれば。

0
sari