2016-01-10 64 views
0

我的項目使用的是Spring Web Flow 2.4,我需要使用Spring AOP來指導流程作用域bean來處理像日誌記錄這樣的方面要求。 這裏是方面類:如何在Spring Webflow中建議flowcope 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自動代理:

<aop:aspectj-autoproxy /> 

而且每個單獨的文件-flow.xml

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

我使用的相同的模式,以輕鬆建議服務bean和控制器,但它不適用於流程範圍的bean,該方面從未執行。 我認爲它可能是JDK動態接口代理的東西,但是它也失敗了CGLIB(proxy-target-class =「true」屬性被設置)。切入點從未被攔截。所以我懷疑流程範圍bean在實例化時從未正確代理過。

我試着切換到LTW,但它拋出了一個NoSuchMethodError(這個bean是由weaveinfo日誌編織而成的)。也許最好爲此單獨打開另一個線程。

我的問題是,是否可以使用Spring AOP來建議一個流作用域bean,以及如何做到這一點?

回答

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) {...} 
    ... 
}