2

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

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

但是HandlerInterceptors 在 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>

如何将变量添加到模型中?

是否有解决方法,例如请求参数?

4

2 回答 2

6

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


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

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

所以重写这个函数是没有意义的,但是这个函数ServletExternalContext通过调用它的方法创建了一个对象,它保存了所有的流变量:

protected ServletExternalContext createServletExternalContext(
    HttpServletRequest request, HttpServletResponse response)

通过覆盖这个函数,你几乎可以用这个流变量做你想做的事。


为此,只需创建一个扩展类FlowHandlerAdapter,注册它而不是 FlowHandlerAdapter 并覆盖该createServletExternalContext函数。

基本上你ServletExternalContext.getSessionMap()用来访问SharedAttributeMap和注册你的属性。

由于您可以访问HttpServletRequestHttpServletResponse对象,因此此方法可以像函数一样HandlerInterceptorAdapter.postHandle起作用。

请参阅下面的示例。

我省略了如何使用通用方式为HandlerInterceptorMVC 和这个对象重用相同的代码,但是通过实现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>
于 2012-11-17T14:41:02.237 回答
0

ModelAndView当拦截器正在处理 Ajax 请求时可以为 null。

只需检查是否ModelAndViewnull。如果没有,那是因为拦截器正在处理一个视图模型,所以你可以在这个时候添加你的变量。

于 2012-03-13T16:43:50.460 回答