我有一个HandlerInterceptor来添加一些“全局”模型变量。有用。

现在,出于相同的原因,我尝试在Spring Web Flow中重用它。

但是HandlerInterceptor在Spring Web Flow下将ModelAndView参数设置为NULL(无法弄清楚原因,但这是事实)。

我在FlowHandlerMapping bean中引用了我的拦截器:

<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>


如何向模型添加变量?

有没有解决方法,例如request参数?

最佳答案

从Spring Webflow 2开始,不再生成ModelAndView对象(请参阅SpringSource论坛上的this post(和线程))。



FlowHandlerAdapter handle()函数不再生成ModedAndView(它仅返回null),即使该函数是:

public ModelAndView handle(HttpServletRequest request,
        HttpServletResponse response, Object handler)


因此,覆盖此函数毫无意义,但是此函数通过调用其方法创建一个ServletExternalContext对象,该对象保存所有flow变量:

protected ServletExternalContext createServletExternalContext(
    HttpServletRequest request, HttpServletResponse response)


通过覆盖此功能,您几乎可以使用此流变量来完成您想要的操作。



为此,只需创建一个扩展FlowHandlerAdapter的类,而不是FlowHandlerAdapter对其进行注册并覆盖createServletExternalContext函数。

基本上,您使用ServletExternalContext.getSessionMap()访问SharedAttributeMap并注册您的属性。

当您可以访问HttpServletRequestHttpServletResponse对象时,此方法的作用很像HandlerInterceptorAdapter.postHandle函数。

请参阅下面的示例。

我省略了如何使用通用方法为MVC和该对象的HandlerInterceptor重用相同的代码,但是通过实现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;
    }
}


您在webflow-context.xml文件中定义了FlowHandlerAdapter对象,如下所示:

<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>

10-04 19:57