アノテーションのみ(web.xmlなし)を使用してJAX-RSアプリケーションをセットアップするにはどうすればよいですか?


80

アノテーションのみを使用してJAX-RSアプリケーションをセットアップすることは可能ですか?(サーブレット3.0およびJAX-RSジャージー1.1.0を使用)

試してみましたが、運がありませんでした。いくつかを使用するweb.xml必要があるようです。


構成A(機能していますが、web.xml構成があります)

web.xml

   ...
   <servlet>
      <servlet-name>org.foo.rest.MyApplication</servlet-name>
   </servlet>
   <servlet-mapping>
       <servlet-name>org.foo.rest.MyApplication</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   ...

Java

@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

構成B(機能しない、例外がスローされる)

@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

後者は、アプリケーションがサーブレットのサブクラスになることを主張しているようです(例外は当て推量を残しません)

java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

質問

  1. web.xml定義が機能したのに、アノテーションが機能しなかったのはなぜですか?違いは何ですか?

  2. それを機能させる方法はありますか?たとえば、web.xmlのないJAX-RSアプリケーションがありますか?


1
NetBeansを試すことができる場合は、RESTFulWebサービスを作成するためのウィザードがあります。あなたがやろうとしているのは、このウィザードがバージョン6.8で行っていることのようです。私は7.0.1を使用しており、新しいアプローチはより単純ですが、目的のために単一のサーブレット、つまりcom.sun.jersey.spi.container.servlet.ServletContainerを使用しますが、それはweb.xmlで定義されています
perissf 2012

回答:


168

** TOMCATまたはJETTYを使用する場合は、必ずお読みください。****

受け入れられた回答機能しますが、WebアプリがGlassfishやWildflyなどのアプリサーバー、および場合によってはTomEEなどのEE拡張機能を備えたサーブレットコンテナにデプロイされている場合に限ります。Tomcatのような標準のサーブレットコンテナでは機能しません。ここで解決策を探しているほとんどの人が使用したいと思うでしょう。

標準のTomcatインストール(または他のサーブレットコンテナ)を使用している場合、TomcatにはREST実装が付属していないため、REST実装を含める必要があります。Mavenを使用している場合は、これをdependenciesセクションに追加します。

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

次に、アプリケーション構成クラスをプロジェクトに追加するだけです。残りのサービスのコンテキストパスを設定する以外に特別な構成が必要ない場合は、クラスを空にすることができます。このクラスが追加されると、何も構成する必要はありませんweb.xml(またはまったく構成する必要はありません)。

package com.domain.mypackage;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}

この後、Javaクラスで標準のJAX-RSアノテーションを使用して、Webサービスを宣言するのは簡単です。

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

必要なのはこれだけです。Tomcatインストールがポート8080でローカルに実行されていて、WARファイルをコンテキストmyContextにデプロイする場合は、...

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

...期待される結果が得られるはずです(5)。


6
@ JavaDude-WARファイルweb.xmlが存在しない場合でも、WARファイルをビルドするようにMavenを構成する必要があります。のpom.xml「ビルド>プラグイン」の下に、次を追加します(まだ存在しない場合)<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin>
アルビントンプソン

6
@ JavaDude-重要な部分は<failOnMissingWebXml>false</fai‌​lOnMissingWebXml>オプションです。
アルビントンプソン

3
@ JavaDude-そうでない場合は、拡張Applicationして@ApplicationPathアノテーションを追加するクラスを作成していない可能性があります。クラスは空にすることができますが、そこにある必要があります。
アルビントンプソン

3
依存関係jersey-container-servlet全体を取得せずに、を追加するだけで十分jaxrs-riです。たとえば、私の場合は'org.glassfish.jersey.core:jersey-server:2.18'+'org.glassfish.jersey.containers:jersey-container-servlet:2.18'でした。
leveluptor 2015年

3
質問には「java-ee」というタグが明確に付けられているため、jee環境に対応していない回答の提供と賛成についてのあいまいさはわかりません。-1
Jan Galinski 2015

51

私がする必要があるのはこれだけのようです(サーブレット3.0以降)

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/*")
public class MyApplication extends Application {
    ...
}

そして、web.xml構成は明らかに必要ありませんでした(Tomcat 7で試してみました)


1
これがどのように機能するか理解できません。他の構成なしで注釈のみを使用できますか?私はこのように試しましたが、まだ機能していません...
Filipe 2014

2
@Filipe:Tomcatまたはその他のサーブレットコンテナを使用していると思います。これは実際にはTomcatのようなサーブレットコンテナでは機能しません。GlassfishやWildflyのようなアプリサーバー、そしておそらくTomEEでのみ機能します。Tomcatを使用している場合は、以下の私の(遅い)回答を参照してください。
アルビントンプソン

8
この回答はTomcatまたはJettyでは機能しません!これらの(および他の)サーブレットコンテナで動作させるには、私の回答を参照してください。
アルビントンプソン

1
実装によっては、web.xml必要ですが、空の場合でも十分です。docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html_single/…を
Benjamin Maurer

これはWebSphereLibertyで機能しますが、WebSphere8.xおよび9.0Classicでは機能しません。
Archimedes Trajano 2017年

15

JAX-RS:RESTful Webサービス仕様のJava™APIの第2章では、サーブレット環境でのJAX-RSアプリケーションの公開プロセスについて説明しています(仕様のセクション2.3.2サーブレット)。

サーブレット3環境のみが推奨されることに注意してください(セクション2.3.2サーブレット、6ページ)。

実装は、サーブレット3フレームワークのプラグ可能性メカニズムをサポートして、コンテナー間の移植性を可能にし、コンテナーが提供するクラススキャン機能を利用することをお勧めします。

つまり、no-web.xmlアプローチを使用する場合は、RESTfulサービスリソースをjavax.ws.rs.ApplicationPathアノテーションに登録するjavax.ws.rs.core.Applicationのカスタム実装で可能です。

@ApplicationPath("/rest")

あなたは、記事読むのが好きもジャージについて、具体的かもしれ尋ねたが、JAX-RSおよびWebSphere 8.5のLibertyプロファイルでの実装RESTfulなサービスを、私は用なし-web.xmlの公開プロセスで説明したのWebSphereリバティプロファイルの実装としてApache Winkのと( JAX-RS)。


1
ありがとう!、私を悩ませている別の質問があります。ルートにパスを設定し(@ApplicationPath( "/ *")など)、アノテーションのみを使用してJSPを提供する方法はありますか?(web.xml構成でも実現できませんでしたが)-質問はここにあります:stackoverflow.com/questions/10874188/…、JAX-RSをよく知っているようですので、ご覧ください。:)多分あなたは私が欠けているものを見るでしょう...ありがとう!
エランメダン2013

知りません。リクエストを処理するためにリソースを解決するプロセスはURLパターンと完全に一致するため、追加の構成なしで機能するはずだという直感があります。見て応答します。私の知識を広げるように励ましてくれてありがとう!:-)
Jacek Laskowski 2013

イムは、使用して@ApplicationPath("")のJBoss EAP 7上(Webアプリケーションのコンテキストルートからの相対)ルートに私のRESTサービスを持っている私が持っているどちらbeans.xmlweb.xml
Julien Kronegg 2018年

7

pom.xmlで適切な依存関係を設定する必要があります

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>

詳細はこちら: jax-rsのスターターサンプル


ResourceConfig / Applicationを使用した場合、web.xmlを削除できますか?
BAE 2017

はい。ただし、これをpom.xmlに追加する必要があります。ifusnigmave:<failOnMissingWebXml>
ACV

ありがとう。しかし、web.xmlでできることはありますが、ResourceConfigではできませんか?
BAE 2017

いいえ、サーブレット仕様3.0のweb.xmlはもう必要ないので、私は思います。ただし、何かを変更する場合は再コンパイルが不要なため、web.xmlを使用する方が便利な場合があります。
ACV 2017

そして、Mavenを使用していない場合はどうなりますか?私のプロジェクトは現在大きすぎて元に戻すことができません。
TheRealChx101 2017

1

前述の依存関係は私には機能しませんでした。ジャージーユーザーガイドから:

ジャージーは2つのサーブレットモジュールを提供します。最初のモジュールは、コアサーブレット統合サポートを提供するJerseyコアサーブレットモジュールであり、サーブレット2.5以降のコンテナで必要です。

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet-core</artifactId>
</dependency>

追加のサーブレット3.xデプロイメントモードと非同期JAX-RSリソースプログラミングモデルをサポートするには、追加のJerseyモジュールが必要です。

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet</artifactId>
</dependency>

jersey-container-servletモジュールはjersey-container-servlet-coreモジュールに依存しているため、使用する場合は、jersey-container-servlet-coreの依存関係を明示的に宣言する必要はありません。

https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3


0

@ Eran-Medanが指摘したように、JBoss EAP 7.1(Webアプリケーションがないため、サーブレットがないため、EJB 3.2プロジェクトで実行していました)、「value」属性を追加する必要がありました。 value属性が必要でした。

これは私のために働いた

    @ApplicationPath(value="/*")
        public class MyApplication extends Application {

            private Set singletons = new HashSet();

            public MyApplication() {
                singletons.add(new MyService());
            }

            ...
    }

スタックトレース

    Caused by: java.lang.annotation.IncompleteAnnotationException: javax.ws.rs.ApplicationPath missing element value
        at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:80)
        at com.sun.proxy.$Proxy141.value(Unknown Source)
        ... 21 more
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.