2

我有为三个不同实体提供处理的流程。因此,我有具有公共流状态的父流定义,并且在具体流定义中,我用真实数据和动作实现扩展了该流。

我想将处理实体的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实现必要处​​理的单例 bean在哪里。它是无状态的,因此序列化它是没有用的,而且它包含自动装配的 dao 变量,其实现使用无法序列化的 HibernateDaoSupport。

有没有办法克服这个问题?我有一个解决方案,但这不是很方便,因为我需要在每个具体的处理器方法调用的具体流定义样板代码中编写。

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

这有点麻烦。

4

1 回答 1

0

您可以在您的ConcreteProcessor

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

这将注入 CGLIB 代理而不是ConcreteProcessor. 代理是可序列化的,并且在反序列化时会重新注入依赖项。

缺点是你的类路径中必须有 CGLIB。或者,使用基于接口的代理

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

但是你ConcreteProcessor必须实现一个接口。

于 2013-01-31T19:04:19.273 回答