Spring mvc 使用HandlerInterceptor向SpringWebFlow添加模型属性

Spring mvc 使用HandlerInterceptor向SpringWebFlow添加模型属性,spring-mvc,spring-webflow-2,Spring Mvc,Spring Webflow 2,我有一个HandlerInterceptor来添加一些“全局”模型变量。它起作用了 现在,出于同样的原因,我尝试在SpringWebFlow中重用它 但是HandlerInterceptors在SpringWebFlow下将ModelAndView参数设置为NULL(不知道为什么,但这是事实) 我在FlowHandlerMappingbean中引用了我的拦截器: <bean class="org.springframework.webflow.mvc.servlet.FlowHandler

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

现在,出于同样的原因,我尝试在SpringWebFlow中重用它

但是HandlerInterceptors在SpringWebFlow下将ModelAndView参数设置为NULL(不知道为什么,但这是事实)

我在FlowHandlerMappingbean中引用了我的拦截器:

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

如何向模型中添加变量


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

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


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

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


FlowHandlerAdapter
handle()函数不再生成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
并注册您的属性

由于您可以访问
HttpServletRequest
HttpServletResponse
对象,因此此方法的作用非常类似于
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>


无控制器:这是一个网络流!:-)实际上,我找到了一个“干净”的解决方法:我创建了一个@Service注释类,该类由HandlerInterceptor为MVC组件调用,在流内部为SWF组件调用。这在某种程度上避免了代码重复。嗨,我在SpringWebFlow中集成拦截器时遇到了一个问题,你能帮我吗。