Начиная с Spring Webflow 2, объект ModelAndView
больше не генерируется (см. в этом посте (и ветка) на форуме SpringSource).
Функция FlowHandlerAdapter
handle () больше не генерирует ModedAndView (просто возвращает ноль), даже если эта функция:
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object handler)
Таким образом, переопределение этой функции бессмысленно, но эта функция создает объект ServletExternalContext
, который содержит все переменные потока, вызывая его метод:
protected ServletExternalContext createServletExternalContext(
HttpServletRequest request, HttpServletResponse response)
Переопределив эту функцию, вы можете в значительной степени делать то, что вы хотите, с этими переменными потока.
Чтобы сделать это, просто создайте класс, расширяющий FlowHandlerAdapter
, зарегистрируйте его вместо FlowHandlerAdapter и переопределите функцию createServletExternalContext
.
Обычно вы используете ServletExternalContext.getSessionMap()
для доступа к SharedAttributeMap
и регистрации своих свойств.
Поскольку у вас есть доступ к объектам HttpServletRequest
и HttpServletResponse
, этот метод может вести себя как функция HandlerInterceptorAdapter.postHandle
.
См. Пример ниже.
Я пропустил, как использовать универсальный способ повторного использования одного и того же кода для HandlerInterceptor
для MVC и этого объекта, но его легко кодировать, реализовав HandlerInterceptor
.
MyFlowHandlerAdapter:
package my.package;
public class MyFlowHandlerAdapter extends FlowHandlerAdapter {
@Override
protected ServletExternalContext createServletExternalContext(
HttpServletRequest request,
HttpServletResponse response) {
ServletExternalContext context =
super.createServletExternalContext(request,response);
context.getSessionMap().put("myproperty", "myvalue");
return context;
}
}
У вас есть объект FlowHandlerAdapter
, определенный в вашем файле webflow-context.xml:
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
Просто замените его на:
<bean class="my.package.MyFlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>