如何解决如何从Freemarker TemplateDirectiveModel访问Spring RequestContext
|| 我正在使用带有Freemarker的Spring MVC作为视图技术。我有一个TemplateDirectiveModel对象,需要在execute方法内访问Spring的RequestContext。目前我是这样的:public class MyDirective implements TemplateDirectiveModel
{
public void execute(Environment env,Map params,TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException,IOException
{
StringModel model = (StringModel) env.getGlobalVariable(\"springMacroRequestContext\");
RequestContext requestContext = (RequestContext) model.getWrappedObject();
}
}
但是我无法相信这是正确的方法。我感觉自己错过了一些重要的事情。也许在Spring中有一些特殊的类和注释来处理Freemarker的收益?也许我可以让Spring向可以访问Springs请求范围的指令类中注入一些东西?
解决方法
您可以将
FreeMarkerConfigurer
子类化,以覆盖其postProcessConfiguration(Configuration config)
方法。
您的实现将只是在配置中放入一个请求感知的依赖项,例如,作为共享变量(由FM文档预先定义)。
应该做的把戏,春天的风格...
,有一种更简单的方法可以做到这一点。如果您已经在使用spring的FreeMarkerConfigurer,则可以将其传递给变量映射:
<bean id=\"freemarkerConfig\" class=\"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer\"
p:templateLoaderPath=\"/some_path_here\">
<property name=\"freemarkerVariables\">
<map>
<entry key=\'macroName\' value-ref=\"templateModelRef\" />
</map>
</property>
</bean>
<bean id=\"templateModelRef\" class=\"...class..extends TemplateModel\">
<property name=\"someResource\" value-ref=\"resourceRef\"/>
</bean>
现在至少在扩展TemplateDirectiveModel的execute方法的类中,您可以访问该注入的属性。
public class MyDirective extends TemplateDirectiveModel {
private MyResource someResource;
@Override
public void execute(Environment env,Map params,TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException,IOException {
StringModel sharedVariable = (StringModel)env.getConfiguration().getSharedVariable(\"beanName\");
MyClass sweetness = (MyClass)sharedVariable.getWrappedObject();
}
}
现在,您可以在.ftl中使用:
<@macroName />
并将自动注入spring依赖项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。