14

私はどこでも検索してきましたが、明確な答えを見つけることができないようです...

サーバー(私の問題ではglassfish)が@Contextで注釈が付けられた実際のオブジェクトを注入するメカニズムは何ですか?より具体的には、次のようなことを行うクラスを作成したい場合:

@Path("/")
public class MyResource {
  @GET
  public String doSomething(@Context MyObject obj) {
    // ...
  }
}

それならどうすればいいですか?MyObjectがインスタンス化されるのはどこで、誰が、どのように行うのですか?

編集:私は次のようなものを見てきました:

JAX-RSでの@Context、@ Provider、およびContextResolverの使用

http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html

ただし、これは私が見たものと一致しません。たとえば、org.neo4j.server.rest.web.RestfulGraphDatabaseのコンストラクターでは、次の署名があります。

public RestfulGraphDatabase(
  @Context UriInfo uriInfo,
  @Context Database database,
  @Context InputFormat input,
  @Context OutputFormat output,
  @Context LeaseManager leaseManager )
4

4 に答える 4

8

独自のインジェクションプロバイダーを作成し、それをジャージーにプラグインすることができます-SingletonTypeInjectableProviderとPerRequestTypeInjectableProviderを見てください-これらのクラスの1つを拡張し(インジェクション可能なオブジェクトに必要なライフサイクルに応じて)、実装をプロバイダーとしてWebアプリに登録します。

たとえば、次のようなものです。

@Provider
public class MyObjectProvider extends SingletonTypeInjectableProvider<Context, MyObject> {
    public MyObjectProvider() {
        // binds MyObject.class to a single MyObject instance
        // i.e. the instance of MyObject created bellow will be injected if you use
        // @Context MyObject myObject
        super(MyObject.class, new MyObject());
    }
}

Webアプリにプロバイダーを含めるには、いくつかのオプションがあります。

  1. アプリがクラスパススキャン(またはパッケージスキャン)を使用している場合は、プロバイダーが正しいパッケージ/クラスパスにあることを確認してください
  2. または、META-INF / servicesエントリを使用して登録することもできます(コンテンツにプロバイダークラスの名前が含まれるMETA-INF / services / com.sun.jersey.spi.inject.InjectableProviderファイルを追加します)
于 2012-06-05T14:47:25.517 に答える
3

私は何かに取り組んでいるかもしれないと思います...そしてこれがうまくいけば、マーティンは部分的な信用を得るはずです。:)

@Providerクラスはcom.sun.jersey.spi.inject.Injectable<T>インターフェースを実装する必要があるようです。ただし、これで実際に@Contextを挿入するのに十分かどうかはわかりません。不足しているのは、WebアプリのResourceConfigオブジェクトに@Providerについて通知する必要があることです。私がやろうとしていることとの関連で、neo4j-serverからヒントを得て、残りの作業は次のように要約されます。

  • com.sun.jersey.spi.container.servlet.ServletContainerを拡張し、configureメソッドをオーバーライドします。
@Override
protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa)
{
  super.configure( wc, rc, wa );
  Set<Object> singletons = rc.getSingletons();
  singletons.add(new MyObjectProvider());
}
  • このコンテナーをweb.xmlデプロイメント記述子で使用する必要があることを指定します。
<servlet>
  <servlet-name>JAX-RS Servlet Container</servlet-name>
  <servlet-class>com.blah.MyServletContainer</servlet-class>
</servlet>
于 2012-06-05T15:41:48.780 に答える
0

@Contextのようなユーザー定義型では使用できないと思いますMyObject。これは、jax-wsがすでに理解しているタイプを注入するためのものです。ここに記載されています。

JAX-RS仕様の第5章では、@Contextで使用できるすべての標準JAX-RSJavaタイプを紹介しています。

@FormParamおそらく、またはのようなものを使用したいと思うでしょう@PathParam。説明については、仕様のセクション2.3を参照してください。仕様のそのセクションからコピーしたあなたの答えは次のとおりです。

一般に、メソッドパラメータのJavaタイプは次のようになります。

  1. プリミティブ型であること。
  2. 単一のString引数を受け入れるコンストラクターがあります。
  3. 単一のString引数を受け入れるvalueOfまたはfromStringという名前の静的メソッドがあります(たとえば、Integer.valueOf(String)およびjava.util.UUID.fromString(String)を参照)。また
  4. List、Set、またはSortedSetであり、Tは上記の2または3を満たします。結果のコレクションは読み取り専用です。
于 2012-06-05T13:25:47.240 に答える
-1

JAX-RS仕様の第5〜6章を参照してください。それはあなたがそれについて知る必要があるすべてをあなたに伝えるべきです。

于 2012-06-05T13:24:14.870 に答える