Весенняя сериализация переменной webflow

У меня есть поток, который обслуживает обработку для трех разных объектов. Таким образом, у меня есть родительское определение потока с общими состояниями потока, а в конкретном определении потока я расширяю этот поток реальными данными и реализацией действий.

Я хочу сохранить экземпляр компонента, который обрабатывает объект в переменной, поэтому я могу получить доступ к этой переменной в определении родительского потока.

В определении родительского потока

<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 — одноэлементный компонент, реализующий необходимую обработку. Он не имеет состояния, поэтому сериализовать его бесполезно, кроме того, он содержит переменные dao с автоматическим подключением, реализация которых использует HibernateDaoSupport, который не может быть сериализован.

Есть ли способ преодолеть эту проблему? У меня есть одно решение, которое, однако, не очень удобно, так как мне нужно будет писать в каждом шаблонном коде определения конкретного потока конкретный вызов метода процессора.

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

Это немного громоздко.


person michael nesterenko    schedule 02.11.2012    source источник


Ответы (1)


Вы можете использовать прокси-сервер с ограниченной областью действия на своем ConcreteProcessor:

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

Это введет прокси-сервер CGLIB вместо фактического экземпляра ConcreteProcessor. Прокси является сериализуемым и будет повторно внедрять зависимости при десериализации.

Недостатком является то, что вы должны иметь CGLIB в своем пути к классам. Или используйте проксирование на основе интерфейса с

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

но тогда ваш ConcreteProcessor должен реализовать интерфейс.

person rootkit    schedule 31.01.2013