問題タブ [jsr299]
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 - サブクラスのランタイム タイプでイベントを発生させる
実行時にしか判別できないタイプのイベントを CDI で発生させたいと考えています。たとえば、A
実装クラスAA
とAB
. 私は2人のオブザーバーを持っています:
次に、いくつかのイベント プロデューサー:
orA
のサブタイプではないため、これは機能しません(逆です)。サブタイプを取るメソッドがあることに気付きました:AA
AB
select
ただし、正しくパラメーター化されたClass
オブジェクトが必要です (間違っていれば正しい)、実行時にビルドできません。
解決策はありますか、または修飾子 (おそらくClass<?>
メソッドの注釈) を使用する必要がありますか?
java - 同じクラスのオブジェクトを異なるスコープで注入するにはどうすればよいですか?
単純さと正確さの観点から、同じクラスのオブジェクトを異なるスコープで注入するための最良の方法は何ですか?
サーブレットで、スコープが異なる同じクラスのオブジェクトを挿入したいと思います。jsfを使用するかどうかはまだわかりません。
- シンプルさ:
Qualifier
スコープごとにとプロデューサーメソッドを作成するのは多すぎます。インターフェイスの作成、2つのクラス、および追加と代替beans.xml
も多すぎます。メソッドを持つことAddress#isCurrent()
は意味がありません。 - 正しさ:JSR299、3.11によると:注入ポイント修飾子として@Namedを使用することはお勧めしません。 まだ理由はわかりません。インジェクションポイントで
使用すると 、では機能しますが、では機能しません。以下の名前付きスニペットを参照してください。@Named
@ApplicationScoped
@RequestScoped
@SessionScoped
春にはとても簡単です:
春のスニペット
名前付きスニペット
cdi - CDI インジェクションの場合、プロデューサー アーカイブとインジェクト アーカイブに META-INF/beans.xml が必要ですか?
おそらく、 CDI 1.0 仕様をくまなく調べるのに時間がかかりすぎたのかもしれませんが、aMETA-INF/beans.xml
が必要な正確な場所の詳細な説明を見つけることができませんでした。
( Bean の発見に関するセクションでは、特定のことを示唆するいくつかの興味をそそるステートメントを作成しますが、それが規範的かどうかはわかりません。)
大まかに言えば、Bean アーカイブには 1 つ必要であることを理解しています。
ただし、準拠する CDI 1.0 環境で次の jar を使用する場合を考えてみましょう。
- インターフェイスのみを含むインターフェイスjar
- これらのインターフェースを実装し、インジェクション ポイントを備えているがプロデューサー メソッドを含まないCDI Bean を含む実装 jar
@Inject
- で注釈が付けられた単一のメソッドを持つ単一の Java オブジェクトを (簡単にするために) 含むプロデューサーjar
@Produces
。
プロデューサー jarと実装 jarの両方が Bean アーカイブである必要があることは論理的に思えます。そのため、それぞれMETA-INF/beans.xml
に含まれるリソースが必要になります。
しかし、完全を期すために、これは実際に当てはまりますか? 実装 jarはポイントのみを使用し、@Inject
CDI 注釈を使用しないため、他の方法でスキャンされますか? 別の見方をすると、この例では、実装 jarはインジェクションのターゲットとしてのみ使用され、インジェクタブルのソースとしては使用されません。したがって、ある種のロジックを確認できました: 見て、注入できるBean を生成する jar のみを Bean アーカイブとして宣言する必要があります。(それが真実だと言っているのではありません。その議論が行われているのを見ることができただけです。)
最後に、インターフェース jarの全体の問題があります。定義上、Bean は含まれていませんが、GlassFish では、インターフェース jarMETA-INF/beans.xml
でさえファイルが必要なケースをずっと前に見てきました。それは私には間違っているように思えますが、驚いたことに、これを確認または否定するセクションが仕様に実際に見つからないことに気付きました。
だから:beans.xml
どこでも?注射剤を生産する瓶だけですか?注射対象の瓶だけ?または...?
cdi - CDI プロデューサー メソッドの使用を強制するにはどうすればよいですか?
ここでの問題の一部は、適切な語彙を使用することです。そのため、用語の単純な問題である可能性があることを前もってお詫びします。
Person
インターフェイスと、そのインターフェイスを実装するクラスPersonBean
があるとします。
さらに@Produces
、 を返す (注釈付きの)プロデューサー メソッドがどこかにあるとしますPerson
。内部的には newPersonBean
を返しますが、それはここにもありません。
最後に、次のように定義された注入ポイントを持つ別の CDI Bean があるとします。
すべてのbeans.xml
ファイルが配置され、Weld または別の CDI-1.0 準拠の環境がブートストラップされていると仮定すると、あいまいな定義エラーが発生します。これは理にかなっています: Weld は myPersonBean
をインジェクションの候補として見つけ (コンストラクターを呼び出すだけでよい)、私のプロデューサー メソッドの出力をインジェクションの候補として見つけます。
私がやりたいことはPerson
、このアプリケーションでのインスタンスの生成が常にプロデューサー メソッドを経由するように強制することです。
どこかで何らかの修飾子を発明Person
し、その修飾子によって修飾されるインスタンスをプロデューサー メソッドに生成させることができることを理解しています。私がそれを行い、修飾子を含むように注入ポイントを変更すると、明らかにこれらの修飾された注入可能オブジェクト (つまり、私のプロデューサー メソッド) のソースは 1 つしかないため、出来上がり、問題は解決しました。
しかし、偽の修飾子を発明したくないとします。(これが事実だと言っているわけではありません。問題をより深く理解しようとしているだけです。) どのような選択肢がありますか? 私は持っていますか?CDIに見えないようにするために を@Typed(Object.class)
つければいいのかな…。PersonBean
Person
ドキュメントへのポインタ、またはこれを理解するためのより良い方法など、あらゆるアイデアを歓迎します。ありがとう。
cdi - オブジェクトがプロデューサーメソッドによって生成された場合、そのイニシャライザーメソッドは自動的に呼び出されますか?
<code>Personのインスタンスを作成するプロデューサーメソッドがあります。
このメソッドが作成するインスタンスは型PersonBean
であり、明らかに実装されていPerson
ます。
このクラスには、初期化メソッドが含まれています。
BeanアーカイブのクラスパスにもSomething
実装があり、ここに注入する候補となるはずです。
この実装は、プロデューサーメソッドで生成されていない別のオブジェクトの適切に注釈が付けられたフィールドに注入されることを確認したので、Weldがそれを検出していること、有効であるなどを確認しています。
私のプロデューサーメソッドの戻り値に、 Weld/コンテナーが提供する依存性注入も適用されるかどうかについての仕様は(私には)明確ではありません。
私は確かに、この初期化メソッドが自動的に呼び出されないことを観察しています。
要約すると、私の質問は、オブジェクトを生成している場合、それは私のプロデューサーメソッドがそのオブジェクトのすべての初期化を処理する必要があることを意味しますか、それとも(代わりに私が期待すること)私のプロデューサーメソッドはインスタンス化のみを担当しますか?
netbeans - Errai、CDI、Netbeans の警告、beans.xml
「満たされていない依存関係: 注入ポイントに一致する Bean がありません」に関するこれらの厄介な Netbeans 警告を削除する簡単な方法はありますか? 問題は、GWT および Errai パッケージに beans.xml ファイルが含まれていないため、Bean アーカイブとしての資格がないため、アクティブ化された Bean が含まれていないことです。
これらのパッケージを外部から「アップグレード」する方法はありますか。それらを再構築または変更せずに?
その点で、Errai は JSR-299 に準拠していないようです。
前もって感謝します!
java - Weld @Inject ApplicationScope Bean は、すべての注入ポイントで新しいインスタンスを作成します
Weld を使用して CDI を理解しようとしています。次の構造を取得しました。
FooFacade も @ApplicationScope です。
アプリの起動時に MainFacade インスタンス = 1 を取得しました。それを他のクラス (GWT RPC サーブレット) に挿入し、mainFacade.getFooFacade() を呼び出すと、MainFacade の新しいインスタンスが fooFacade の新しいインスタンスと共に作成されます。
Weld は、どこに注入しても同じアプリケーション スコープ Bean のインスタンスを返すと考えました。私が間違っていることは何ですか?