Повторное использование определений Spring Webflow с различными реализациями действий

У меня довольно большое определение веб-потока, которое я не хочу копировать/вставлять для повторного использования. В XML есть ссылки на компонент действия, что вполне естественно.

Я хочу использовать одно и то же определение потока дважды: второй раз с действиями, настроенными по-разному (внедрить в него другую реализацию службы).

Есть ли простой способ сделать это?


Проблема в том, что я хочу использовать один и тот же поток с разными bean-компонентами одновременно в одном приложении. Копировать/вставить - это плохо, но другого решения я пока не вижу.


person Community    schedule 19.09.2008    source источник


Ответы (4)


Вы можете попробовать создать новый поток, который расширяет «довольно большой», и добавить к нему потокExecutionListeners.

Интерфейс "FlowExecutionListener" определяет методы для следующих событий при выполнении потока:

  • запрос отправлен
  • запрос обработан
  • сеансСоздание
  • начало сеанса
  • сессия начата
  • событиеSignaled
  • переходВыполнение
  • stateEntering
  • видRendered
  • видРендеринг
  • состояниеEntered
  • приостановлено
  • возобновление
  • сеансКонец
  • сессияЗавершена
  • исключениеThrown

Вы можете написать обработчик, который внедряет необходимые ресурсы в ваш поток (и использовать разные дескрипторы с разными потоками), сохраняя его в RequestContext, где вы можете получить к нему доступ в своем определении потока.

Обратите внимание, что в этом случае вам все равно придется изменить «довольно большой поток», чтобы использовать эти ресурсы вместо прямой ссылки на bean-компоненты.

person Arnelism    schedule 22.09.2008
comment
теперь вопрос в том, являются ли компоненты действий с сохранением состояния или без состояния :-) нужно проверить - person ; 22.09.2008

Я в том же исправлении, что и вы... у меня есть разные подклассы, у которых есть соответствующие компоненты действий, но большая часть потока одинакова. В прошлом мы просто копировали и вставляли... недовольны этим! У меня есть несколько идей, которые я собираюсь опробовать, используя язык выражений. Во-первых, я придумал фабрику компонентов действий, которая будет возвращать правильный компонент действий для использования в заданном классе, затем я могу вызвать эту фабрику, чтобы установить переменную, которую я могу использовать вместо жестко запрограммированного имени компонента.

Вот часть потока:

<action-state id="checkForParams">
    <on-entry>
        <set name="flowScope.clientKey" value="requestParameters.clientKey"/>
        <set name="flowScope.viewReportBean" 
                 value="reportActionFactory.getViewBean(reportUnit)"/>
    </on-entry>
    <evaluate expression="viewReportBean"/>

Вычисление в последней строке обычно ссылается непосредственно на bean-компонент, но теперь оно ссылается на результат "набора", который я только что сделал.

Хорошие новости - правый боб называется.

Плохая новость — все в области потока должно быть Serializable, поэтому я получаю исключение NotSerializableException — аааа!

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

Кстати, я использую Spring 2.5.6 и webflow 2.0.7. В более поздних версиях могут быть лучшие способы справиться с этим; в частности, кажется, что EL привлекли некоторое внимание. Я все еще застрял с OGNL, который является Spring 1.x EL.

Я уверен, что какой-нибудь гуру веб-потока знает другие способы сделать что-то менее неуклюжим...

person bobtins    schedule 30.10.2010

Я не думаю, что вы можете использовать одно и то же определение веб-потока с действиями, настроенными двумя разными способами.

Если вы хотите использовать другие действия, вам придется либо перенастроить свои компоненты действий, а затем повторно развернуть свое приложение, либо создать отдельное определение веб-потока с по-разному настроенными компонентами.

Это отличный ресурс Spring WebFlow.

person Owen    schedule 19.09.2008

Попробуйте реорганизовать общую настраиваемую часть в подпотоке и вызовите подпоток из разных основных потоков, где вы хотите его повторно использовать.

Передайте параметры подпотоку, чтобы настроить его любым необходимым образом, используя язык выражений Spring для передачи различных компонентов Spring и т. д.

person Angular University    schedule 08.12.2013