我有一个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>
如何向模型添加变量?
是否有解决方法,例如请求参数?
答案 0 :(得分:6)
从Spring Webflow 2开始,不再生成ModelAndView
对象(请参阅SpringSource论坛上的this post(和线程))。
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>
答案 1 :(得分:0)
ModelAndView
可以为null。
只需检查ModelAndView
是否 null 。如果没有,那是因为拦截器正在处理视图模型,因此您可以在此时添加变量。