2

Seam は、特定のスコープ、タスク、またはプロセスに関連するさまざまな種類のイベントを起動し、スコープ、タスク、またはプロセスの名前をイベントの最後に追加します。

あるタイプのすべてのイベントをリッスンするにはどうすればよいですか?

たとえば、<name>次のようなイベントをリッスンしたい場合:

  • org.jboss.seam.createProcess.<name>— プロセスが作成されたときに呼び出されます
  • org.jboss.seam.endProcess.<name>— プロセスの終了時に呼び出されます
  • org.jboss.seam.initProcess.<name>— プロセスが会話に関連付けられたときに呼び出されます
  • org.jboss.seam.startTask.<name>— タスクの開始時に呼び出されます
  • org.jboss.seam.endTask.<name>— タスクが終了したときに呼び出されます

前もって有効な名前のリストを知らなくても、これを行う必要があります... :-(

@Observer を使用してオブザーバーまたは類似のものを作成したいと考えており、同じコンポーネントで最大 2 つのイベント クラスをリッスンします。

4

2 に答える 2

4

Seam の Events クラスを独自の実装に置き換えることで、これを簡単に行うことができます。次に、特定の文字列で始まる発生したイベントを探します。

@Scope(ScopeType.STATELESS)
@BypassInterceptors
@Name("org.jboss.seam.core.events")
@Install(precedence=APPLICATION)
public class Events extends org.jboss.seam.core.Events
{
   @Override
   public void raiseEvent(String type, Object... parameters )
   {
       super.raiseEvent( type, parameters );

       if ( type.startsWith( "org.jboss.seam.createProcess" ) )
       {
           super.raiseEvent( "org.jboss.seam.createProcess", parameters );
       }
       //etc.
   }
}

「org.jboss.seam.createProcess」を監視して、すべての createProcess イベントを取得できるようになりました。

于 2009-05-22T18:37:26.337 に答える
2

if 内に、super.raiseEvent(...) を記述する必要があります。そうしないと、無限ループが発生します。

于 2009-07-27T15:46:43.323 に答える