2012-11-02 52 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必须实现一个接口即可。