web-dev-qa-db-ja.com

javax.ws.rs.NotFoundException:フルパスのリソースが見つかりませんでした

環境

Windows 7(64)
jdk1.7.0_51(64)
RESTEasy3.0.7
Apache-Tomcat-7.0.50
Project Name: hello

RESTEasyHelloWorldService.Java:

package com.javacodegeeks.enterprise.rest.resteasy;

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

@Path("/RESTEasyHelloWorld")
public class RESTEasyHelloWorldService {

    @GET
    @Path("/{param}")
    @Produces(MediaType.TEXT_PLAIN)
    public String getMsg(@PathParam("param") String name) {
        String msg = "Rest say: good " + name;
        return msg;
    }
}

web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://Java.Sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>hello</display-name>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <!-- Auto scan REST service -->
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>

    <!-- this should be the same URL pattern as the servlet-mapping property -->
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
            </listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
    </servlet>

</web-app>

http://localhost:8080/hello/rest/RESTEasyHelloWorld/aを呼び出すと例外が発生するのはなぜですか?

javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/hello/rest/RESTEasyHelloWorld/a
    at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.Java:73)
    at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.Java:48)
...
8
user3926093

http://localhost:8080/hello/RESTEasyHelloWorld/aを使用してみてください。 (/restなし)。

/restを使用する場合は、RESTEasyHelloWorldService@ Pathを/rest/RESTEasyHelloWorldに変更できます。


ただし、使用しているAPIバージョンに基づいて、RESTfulサービスを機能させるためにはるかに簡単な作業を行うことができます。

クラスパスにresteasy-jaxrslibがあると仮定します。

JBOSSまたはEAPを使用していないため、resteasy-servlet-initializerも取得する必要があります。 Tomcatのようなサーブレット3.0コンテナを使用するためのドキュメント ここ

Applicationを拡張して、たとえばRESTEasyServiceを作成する必要があります。

@ApplicationPath("/rest")
public class RESTEasyService extends Application {
}

RESTEasyはすべてのプロバイダーとリソースをスキャンするため、そのクラスの実装を提供する必要はありません。 Applicationクラスを使用するためのドキュメント ここ

あなたがあなたの質問で言ったようにあなたのRESTEasyHelloWorldServiceを残してください:

@Path("/RESTEasyHelloWorld")
public class RESTEasyHelloWorldService {

    @GET
    @Path("/{param}")
    @Produces(MediaType.TEXT_PLAIN)
    public String getMsg(@PathParam("param") String name) {
        String msg = "Rest say: good " + name;
        return msg;
    }
}

これで、web.xmlには何も必要ありません。 Java WS-RSとRESTEasyはすでにすべてを行っています。

Web.xmlは次のようになります。

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://Java.Sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <display-name>hello</display-name>

</web-app>

RESTEasyの公式ドキュメントは最初は少し混乱しますが、実装がJBOSSアプリとNON-JBOSSアプリで同じであることを理解すると(変更されるライブラリの使用のみ)、作業が簡単になります。

6
fasfsfgs

3.0.11.Finalで試したときに同じ問題が発生しました

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.11.Final</version>
</dependency>

しかし、別のバージョンで試したところ、うまくいきました。

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.4.Final</version>
</dependency>

さらに、web.xmlで/ restについて言及しているので、試行しているURL( http:// localhost:8080/hello/rest/RESTEasyHelloWorld/a )は正しいです。これがお役に立てば幸いです。

4
Raphael

アプリをresteasyバージョン3.0.4から3.0.12に移行するときにも同じ問題が発生しました。

Webサービスは、user3926093が上記で貼り付けたものと同様のweb.xmlで正常に機能していました。私がリリースしたのは、バージョン3.0.7がポイントを変えているということです。そのバージョンの前は、上記のfasfsfgsのようにresteasy-servlet-initializerも必要ありませんでした。しかし、3.0.7以降のバージョンでは、「フルパスのリソースが見つかりませんでした:」という例外が発生し始めました。

それを機能させるために私がしたことは、web.xmlを上記のfasfsfgsと同じように変更することであり(基本的にはすべての構成を削除しました)、javax.ws.rs.core.Applicationクラスのサブクラスもfasfsfgsとして作成しました上記のとおりですが、「そのクラスの実装を提供する必要がない」ということに同意しません。このクラスを実装する方法は、次の場所にあります: https://goo.gl/9TJ3Y2 。リクエストごとのモデルが必要な場合は、この実装は適切ではないことに注意してください。そして最後に、resteasy-servlet-initializer依存関係を追加することを忘れないでください。

2
temuchin