我正在尝试使用上述组件设置webapp。除了最后一个整合Spring& amp;& amp; amp; amp; amp; amp;速度工具。我今天早上看到了this post,并使用与提供的答案略有不同的答案进行了更新。但是,一旦我尝试将ParameterTool添加到我的某个模板中,就像这样:
#foreach( $key in $params.keySet() )
$key = $params.getValue($key)
<br />
#end
我收到一个NPE java.lang.UnsupportedOperationException:Request为null。必须先初始化ParameterTool!根据我所读到的,这意味着工具配置正确,只是它无法访问请求。注意:我也收到了已接受解决方案的错误。
有没有人成功地在Spring上使用这些工具?似乎这是一个已知的缺陷,因为这个Open Jira SPR-5514
有一个Open Jira答案 0 :(得分:2)
来自The accepted answer的this question的略微修改版本可解决此问题。
您需要返回ViewToolContext,而不是返回ViewContext。您还需要准备工具箱并在会话/请求中根据需要进行设置:
您需要以您需要的任何方式初始化toolContext(查看我提供的答案here,了解如何使用更新的API执行此操作,因为您将需要访问ToolboxFactory。
修改后的createVelocityContext方法现在需要在以下列方式创建ViewToolContext之前准备工具箱:
protected Context createVelocityContext(Map <String, Object> model,
HttpServletRequest request,
HttpServletRespsone response)
throws Exception {
initVelocityContext(); //Still keep toolContext static
//will need to also add this to
//the servletContext -- left as an exercise
prepareToolboxes(request, response);
Context context =
new ViewToolContext(getVelocityEngine(), request,
response, getServletContext());
//Set model attrs to context
....
return context;
}
private void prepareToolboxes(final HttpServletRequest request,
final HttpServletResponse response) {
String key = Toolbox.class.getName();
if (factory.hasTools(Scope.REQUEST && request.getAttribute(key) == null) {
Toolbox requestTools = factory.createToolbox(Scope.REQUEST);
request.setAttribute(key, requestTools);
}
if (factory.hasTools(Scope.SESSION) {
HttpSession session = request.getSession();
synchronized(factory) {
//Follow pattern from above
}
}
}