Использование HandlerInterceptor для добавления атрибутов модели в Spring Web Flow - PullRequest
2 голосов
/ 13 марта 2012

У меня есть HandlerInterceptor для добавления некоторых «глобальных» переменных модели.Оно работает.

Теперь я пытаюсь повторно использовать его в Spring Web Flow по той же причине.

Но В HandlerInterceptor для параметра ModelAndView установлено значение NULL в Spring Web Flow (не могу понять, почему, но это факт).

Я ссылался на свой перехватчик в bean-компоненте FlowHandlerMapping:

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="flowRegistry" ref="flowRegistry" />
    <property name="interceptors">
        <list>
            <ref bean="myInterceptor" />
        </list>
    </property>
</bean>

Как добавить переменные в модель?

Есть ли обходной путь, например, с параметром запроса?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2012

Начиная с 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>
0 голосов
/ 13 марта 2012

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

Просто проверьте, является ли ModelAndView нулевым .Если нет, то это потому, что перехватчик обрабатывает модель представления, поэтому вы можете добавить свои переменные в это время.

...