2012-03-13 50 views
2

我有一个HandlerInterceptor来添加一些“全局”模型变量。有用。使用HandlerInterceptor通过Spring Web Flow添加模型属性

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

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

我已经提到我的拦截器在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> 

我如何添加变量模型?

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

回答

6

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


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函数一样。

查看下面的示例。

我省略了如何使用通用方法为0123C重复使用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; 
    } 
} 

你已经在你的Webflow定义-context.xml文件这样的0​​对象:

<bean class="my.package.MyFlowHandlerAdapter"> 
    <property name="flowExecutor" ref="flowExecutor"/> 
</bean> 

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"> 
    <property name="flowExecutor" ref="flowExecutor"/> 
</bean> 

只是更换

+0

您好我有一个在春季Web流程拦截器集成的问题,你可以帮助我。 – 2014-09-25 11:19:13

0

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

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

+0

这不是一个AJAX请求t ... – mexique1 2012-03-13 16:51:41

+0

你能告诉我们调用的控制器方法吗? – tbruyelle 2012-03-13 17:01:59

+0

没有控制器:这是一个网络流量! :-) – mexique1 2012-03-14 09:30:49