5

GWT プロジェクトで RESTEasy を使用して REST サービスを実装しようとしましたが、それぞれの URI に入ると、アプリケーションは次を返します。

Grave: failed to execute
javax.ws.rs.NotFoundException: Could not find resource for full path: http://127.0.0.1:8888/api/matches
    at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73)
    at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48)
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444)
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

私のweb.xmlは次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="no"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <!-- All REST resources will be prefixed by /api -->
  <context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/api</param-value>
  </context-param>

  <!-- Servlets -->
  <servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>eii.api.MatchApplication</param-value>
    </init-param>
  </servlet>

  <!-- Servlet mappings -->
  <!-- All calls to /api/xxx will be sent to the reasy servlet -->
  <servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>

</web-app>

アプリケーションの実装:

public class MatchApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public MatchApplication() {
        singletons.add(new MatchServiceImpl());
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }

    @Override       
    public Set<Object> getSingletons() {
        return singletons;
    }
}

REST サービスを提供するクラスは次のとおりです。

 /* Imports */
    ...
@Path("/matches")
public class MatchResource {
    private static MatchResource _instance = null;
    private MatchRepository repository;

    public MatchResource() {
        repository = new MapMatchRepository(); 
    }

    public static MatchResource getInstance() {
        if (_instance == null)
            _instance = new MatchResource();
        return _instance;
    }

    @GET
    @Path("/{id}")
    @Produces("application/json")
    public Match getMatch(@PathParam("id") int id) {
        return repository.getMatch(id);
    }

    @GET
    @Produces("application/json")
    public Matches getMatchesCurrentRound() {
        return repository.getMatchesCurrentRound();
    }

        ...
}

私が欲しいのは、例えば、入るときにJSONファイルを返すことです:http://127.0.0.1:8888/api/matches

私が間違っていることを誰かが知っていますか?

編集:

http://127.0.0.1:8888/api/orにアクセスしてもhttp://127.0.0.1:8888/api/*(* は書きたいものです)、ブラウザには何も表示されません。http://127.0.0.1:8888/oqiwnただし、 (はランダムな文字列)にアクセスするとoqiwn、ブラウザにError 404.

また、RESTClient アドオンを試したところ、次のような回答が返されました。

http://127.0.0.1:8888/api/または_http://127.0.0.1:8888/api/*

Status Code: 404 Not Found
Cache-Control: no-cache
Content-Length: 0
Date: Sun, 10 Nov 2013 22:59:57 GMT
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Server: Development/1.0

そしてhttp://127.0.0.1:8888/oqiwn

Status Code: 404 Not Found
Cache-Control: no-cache
Content-Length: 83
Content-Type: text/html; charset=iso-8859-1
Date: Sun, 10 Nov 2013 22:59:05 GMT
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Server: Development/1.0

Content-Type: text/html; charset=iso-8859-1最初のものではないことに注意してください。

4

3 に答える 3

2

getMatches()Resteasy が何も知らないという名前のメソッドを使用してリソースを追加しました。getSingletons()以下に示すように、メソッドをオーバーライドしてApplicationそこからルート リソースを返す必要があります。

ドキュメントはこちら

例:

public class MatchApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public MatchApplication() {
        singletons.add(new MatchServiceImpl());
    }

    @Override
    public Set<Class<?>> getClasses() {
        return classes;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}
于 2013-11-09T23:50:07.463 に答える
0

まず、MatchApplication クラスに@ApplicationPath("/api")アノテーションを付ける必要があると思います。それがすでに行われている場合は申し訳ありません。

次に、RESTEasy のバージョンに応じて、プロバイダーまたはリソースであるクラスを自動的にスキャンするため、今のところ MatchApplication に何も実装する必要はありません。アプリケーションを拡張するだけで完了です。

サーブレット 3.0 を使用するように Web アプリを更新できる場合は、web.xml に構成を追加する必要はありません。

詳細については、RESTEasy のドキュメントを参照してください。

于 2014-09-21T17:23:43.643 に答える
0

これは私のすべてのサービスで機能します。

This is a runtime exception indicating a resource requested by a client was not found on the server.
Add below entry into your web.xml :

<context-param>
        <param-name>resteasy.resources</param-name>
        <param-value>com.org.abc.xyz.MainClassName</param-value>
</context-param>

登録する JAX-RS リソース クラス名の完全修飾名を指定できます。複数のクラス エントリがある場合は、カンマ区切りを使用します。

于 2016-12-15T17:06:25.213 に答える