0

私のプロジェクトは Spring Web フロー 2.4 を使用しています。Spring AOP を使用してフロー スコープ Bean にアドバイスし、ロギングなどのアスペクト要件を処理する必要があります。アスペクトクラスは次のとおりです。

@Aspect
@Component
public class LogFlowEventExecutor {
    @Pointcut("execution(public * com.xyz.app.flow.*FlowBean.*(..))")
    private void flowFunction() {}

    @Before("flowOperation()")
    public void logFlowEvent(JoinPoint jp) throws Throwable {
        //logic ignored
        ...
    }
}

また、ルート WebApplicationContext で autoproxy を定義します。

<aop:aspectj-autoproxy />

そして個々の -flow.xml ファイル

<flow xmlns="http://www.springframework.org/schema/webflow"...>
    <var name="abcFlowBean" class="com.xyz.app.flow.AbcFlowBean" />
    ...
</flow>

Service Bean と Controller に簡単にアドバイスするために同じパターンを使用しましたが、フロースコープの Bean では機能せず、アスペクトは実行されませんでした。JDK動的インターフェースプロキシの何かかと思ったのですが、CGLIBでも失敗しました(proxy-target-class="true"属性が設定されていました)。ポイントカットは傍受されませんでした。そのため、フロースコープ Bean がインスタンス化されたときに適切にプロキシされていないのではないかと疑っていました。

LTW に切り替えようとしましたが、NoSuchMethodError がスローされました (Bean は weaveinfo ログから織り込まれました)。それだけのために別のスレッドを立てたほうがいいかもしれません。

私の質問は、Spring AOP を使用してフロー スコープ Bean とその方法をアドバイスすることは可能でしょうか?

4

1 に答える 1

0

Flow Execution Listener を作成することでこの問題を回避しました。基本的に FlowExecutionListener は、フロー実行ライフサイクルの過程で特定のことが発生したときに呼び出される多くのコールバック メソッドを定義します。そこで、空のメソッド本体を使用してすべてのメソッドを実装し、関心のあるものをオーバーライドする FlowExecutionListenerAdapter から拡張されたカスタム リスナー クラスを作成しました。これは、すべてのフロー スコープ Bean でグローバル コールバックが必要な場合、AOP とほぼ同じ種類の効果があります。しかし、それらのいくつかを傍受するだけでよい場合、それは別の話です。

public class MyFlowExecutionListener extends FlowExecutionListenerAdapter{
    @Override
    public void eventSignaled(RequestContext context, Event event) {...}
    @Override
    public void transitionExecuting(RequestContext context, TransitionDefinition transition) {...}
    @Override
    public void viewRendered(RequestContext context, View view, StateDefinition viewState) {...}
    @Override
    public void exceptionThrown(RequestContext context, FlowExecutionException exception) {...}
    ...
}
于 2016-05-12T15:12:03.237 に答える