1

SEAM アプリに次のインターセプターがあるとします。

public class MyInterceptor {
  @In
  private Monitor myMonitor;

  @AroundInvoke
  public Object aroundInvoke(InvocationContext ctx) throws Exception {
    try {
      myMonitor.a();
      return ctx.proceed();
    }
    finally {
      myMonitor.b();
    }
  }
}

myMonitor.a() は機能します (そのため、Monitor は正しく挿入されます)、myMonitor.b() は Monitor が既に null であるため失敗します。Seam Docは次のように述べています。

それが起こっていることですか?SEAM にコンポーネントを「まだ」「消毒」するように指示することはできますか? もちろん、XContext.get(..) のようなこともできますが、これはバグなのか、私の側のミスなのか疑問に思っています。ありがとう!

4

3 に答える 3

1

注射の使用は避けてください。

この問題を回避してみてください。何らかの監視が行われているようです。メソッドが Seam コンポーネントで実行される時間をキャプチャするこのインターセプターを見てください。それに合わせてコードを変更してみてください。

それはうまくいきます!ここにリンクがあります

于 2010-02-12T14:55:19.543 に答える
1

代わりにこれを試してください

Object response = null;

try {
    myMonitor.a();

    response = ctx.proceed();
} finally {
    myMonitor.b();
}

return response;

よろしく、

于 2009-12-12T18:03:50.947 に答える
0

Seam は宣伝どおりに機能しています。

注射を無視することができます:

public class MyInterceptor {

  private Monitor myMonitor;

  @In
  private void setMonitor(Monitor aMonitor) {
     if (aMonitor != null) {
       myMonitor = aMonitor;
     }
  }


  @AroundInvoke
  public Object aroundInvoke(InvocationContext ctx) throws Exception {
    try {
      myMonitor.a();
      return ctx.proceed();
     }
     finally {
       myMonitor.b();
       myMonitor = null; //perform disinjection yourself
     }
  }
}

ここでの注意点は、Seam が何らかの理由で参照を破棄していることです。Seam は "myMonitor" のライフサイクルとアイデンティティを制御したいと考えており、それへの参照を維持することで、Seam との契約を順守していません。これにより、予期しない動作が発生する可能性があります。

たとえば、myMonitor が何らかの理由で Stateless スコープにあった場合、Seam は ctx.proceed() が戻る前にそれを破棄し、壊れたプロキシへの参照を残します。最良のアドバイスは、「エッジに住んでいる」ため、保持しているものの範囲とライフサイクルを知ることです。

于 2010-02-19T18:24:19.547 に答える