問題タブ [injectableprovider]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ジャージー:InjectableProviderがピックアップされていません-春
現在、Jerseyで作成しようとしていますがInjectableProvider
、Jerseyに取得させることができません。
@Provider
その使用法の実際の例、または実装のアノテーションを使用する以外にそれを取得する方法さえも見つけることができません。ジャージー内でそれを書いたように見える人は、これがそれを拾うのに十分であるといくつかの投稿で暗示しました。
SPIサービスファイルを指定する必要がありますか、それともどこかの工場に追加する必要がありますか?
注:私はGlassfish 3.1内で実行しており、Spring3.1を使用しています。Springがsの自動ロードを何らかの形で引き継いでいる可能性があることは合理的と思われますProvider
。しかし、私にはわかりません。私はとにかくSpringを使用して以下の提案されたInjectableProviderを管理していません。また、他の方法でそれを追加しようとはしていません。これは私の問題かもしれません。
基本的な実装:
参照Annotation
:
ジャージー開発者からの参照リンク。
更新:calvinkrishyは私の考えに2つの欠陥を指摘しました。
最初に、Jerseyは@Provider
、従来のJersey-Springサーブレットによってキックオフされた後、sのスキャンを開始する予定であると想定しましたcom.sun.jersey.spi.spring.container.servlet.SpringServlet
。これはほとんど正しくありませんでした。スキャンを開始しますが、アノテーションのあるSpringBeanを探します。
次に、制御するアノテーションを処理するPerRequestTypeInjectableProvider
ためのリクエストが着信するたびに、が要求されると想定しました。Injectable
これも間違っていました。はPerRequestTypeInjectableProvider
起動時に期待どおりにインスタンス化されますが、JerseyはすぐにInjectable
、指定されたアノテーションを指定されたアノテーションで処理するように要求しtype
ます。これは、この時点で管理していると判断したRestfulServicesをスキャンすることで決定されます。つまり、それらすべて)。
PerRequestTypeInjectableProvider
との違いはSingletonTypeInjectableProvider
、結果Injectable
が機能せずに値を含む(シングルトン)か、値を毎回(要求ごとに)検索するため、要求ごとに値を変更できることです。
これは、余分な知識AttributeInjectable
を与えないように、計画したようにいくつかのオブジェクトを渡すのではなく、(以下のコード)で余分な作業を強制することによって、私の計画に小さなレンチを投げ込みました。AttributeInjectable
HttpServletRequest
からを渡すことができることを望んでProvider
いましたが、AttributeInjectable
は一意のアノテーション/タイプごとにのみインスタンス化されます。それができないので、値ごとのルックアップを実行します。これは、 (現在のリクエストに関連するものの中でも)安全に取得するためのメカニズムRequestContextFilter
を提供するSpringのシングルトンを使用します。ThreadLocal
HttpServletRequest
結果は機能し、さまざまなサービスに基本クラスを拡張しての使用法を非表示にすることなく、コードをはるかに読みやすくします@Context HttpServletRequest request
。これは、ヘルパーメソッドを介して上記のように属性にアクセスするために使用されます。
次に、これに沿って何かを行うことができます。
これは、サーブレットフィルタを使用して、データを渡す前にユーザーがサービスにアクセスするための適切な権限を持っていることを確認し、受信データを解析(またはロードなど)して属性にダンプできるため、非常に便利です。ロードされます。
上記のProvider
アプローチが不要で、属性にアクセスするための基本クラスが必要な場合は、次のようにします。
UPDATE2:自分の実装について考えました。これは、それ自体が、特定の型に'AbstractAttributeInjectableProvider
を提供するためだけに存在するジェネリッククラスであり、提供された。要求されるたびにタイプ()が通知される非実装を提供する方がはるかに簡単です。したがって、タイプを提供するコンストラクターのみの実装の束を回避できます。これにより、アノテーションで使用するすべてのタイプのコードを記述する必要もなくなります。AttributeInjectable
Class<T>
AttributeParam
abstract
Class<T>
AttributeParam
AttributeParam
注:それぞれInjectable
は、要求ごとではなく起動時に1回インスタンス化されますが、着信要求ごとに呼び出されます。
couchdb - オブジェクト プールからリソースにデータベース オブジェクトをどのように挿入して処理しますか?
jersey 用の jcouchdb オブジェクトのオブジェクト プールを実装することを考えています。今、jcouchdb インスタンスをリソース エンドポイントに配信する最善の方法は何かを自問しています。
プールには、jcouchdb オブジェクトを要求し、それを解放して再利用できるようにするためのメソッドがあることを期待しています。
私の最初のアイデアは、InjectableProvider をシングルトンとして実装し、リソース エンドポイントで注釈を使用して「取得」することでした。次に、InjectableProvider はオブジェクト プールから jcouchdb オブジェクトを返し、ビジーとしてマークします。使用後に jcouchdb オブジェクトを解放するにはどうすればよいですか? そして、必要がない場合でも、すべてのリソース エンドポイント インスタンスに対して jcouchdb オブジェクトを要求するでしょうか?! (注釈付きオブジェクトがいつインスタンス化されるかはわかりません)
私が考えていた別のアイデアは、オブジェクト プールをサーブレット コンテキストにアタッチすることでした (set 属性を使用)。
他のアイデアはありますか?
共有リソースとジャージに関しては、基本的に少し混乱しています。うまくいけば、誰かが私のために物事を片付けることができます.
ありがとう