2012-11-02 48 views
2

我有三個不同的實體處理流程。因此,我有通用流程狀態的父流程定義,並且在具體流程定義中,我用真實數據和行動實施擴展了流程。spring webflow變量序列化

我想存儲處理實體變量的bean實例,所以我可以在父流程定義中訪問這個變量。

在父流程確定指標

<action-state id="prepareReview" > 
    <evaluate expression="processor.prepare(modelInstance)" /> 
    <transition to="check" /> 
</action-state> 

,並在具體的流程定義我

<on-start> 
    <set name="flowScope.processor" value="concreteProcessor"/> 
</on-start> 

concreteProcessor是一個singleton bean實現必要的處理。它是無狀態的,因此對它進行序列化是沒有用的,而且它包含自動裝配的dao變量,實現使用HibernateDaoSupport,它不能被序列化。

有什麼辦法可以解決這個問題嗎?我有一個解決方案,但不是很方便,因爲我需要在具體的流程定義樣板代碼中編寫具體的處理器方法調用。

<action-state id="prepareReview" parent="common#prepareReview"> 
    <evaluate expression="concreteProcessor.prepare(modelInstance)" /> 
</action-state> 

這有點麻煩。

回答

0

您可以在ConcreteProcessor使用範圍代理:

@Component 
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=ConfigurableBeanFactory.SCOPE_SINGLETON) 

這將注入CGLIB代理,而不是的ConcreteProcessor實際實例。代理是可序列化的,並且在反序列化時將重新注入依賴關係。

缺點是您必須在您的類路徑中使用CGLIB。或者,使用基於接口的代理與

@Scope(proxyMode=ScopedProxyMode.INTERFACES,value=ConfigurableBeanFactory.SCOPE_SINGLETON) 

但你ConcreteProcessor必須實現一個接口即可。