我正在尝试将Freemarker的配置实例初始化并由Spring缓存,以便在我的Restlet应用程序中使用。问题是ContextTemplateLoader
采用类型org.restlet.Context
的参数,可以通过应用程序中的getContext()
方法调用访问。如何在Spring容器中访问这个上下文,其中Restlet是'主容器'(即这是一个使用spring而不是反之亦然的restlet应用程序)?
目前我正在缓存freemarker配置:
public class HelloWorldComponent extends Component {
//Cache freemarkerConfiguration
private static Configuration freemarkerConfiguration;
public HelloWorldComponent()
{
freemarkerConfiguration = new Configuration();
// Must pass getContext() as argument - prevents 'springification?'
ContextTemplateLoader loader = new ContextTemplateLoader(getContext(), "war:///WEB-INF");
freemarkerConfiguration.setTemplateLoader(loader);
/* All other beans created and cached by loading the SpringContext */
SpringContext springContext = new SpringContext(getContext());
springContext.getXmlConfigRefs().add("war:///WEB-INF/applicationContext.xml");
getServers().add(Protocol.HTTP);
this.getDefaultHost().attach(new HelloWorldApplication());
}
public static Configuration getFreemarkerConfiguration()
{
return freemarkerConfiguration;
}
我个人更喜欢让Spring本身可以缓存freemarker配置,但是ContextTemplateLoader
需要Context
,这在应用程序之外是不可访问的。使用静态方法似乎是一种黑客攻击。
让spring实例化freemarker配置的最简单/最简单/最简洁的方法是什么?
原因:在每次访问模板之前加载配置是没有意义的,最好对其进行缓存。如果可以在Spring本身定义并且IoC刚刚在org.restlet.Component
似乎有一个静态方法Context.getCurrent()
可用于获取当前上下文,但我不知道如何通过spring调用它(如果有的话)。我不想让Spring MVC libs等创建一个freemarker配置实例(有ways to do that但我不想要Spring相关的servlet等。)
答案 0 :(得分:0)
如何使用Spring的表达式语言并假设你有一个名为“application”的org.restlet.Application bean:
<bean id="freemarkerConfig" class="freemarker.template.Configuration">
<property name="templateLoader">
<bean class="org.restlet.ext.freemarker.ContextTemplateLoader">
<constructor-arg value="@application.context"/>
<constructor-arg value="war:///WEB-INF/templates/" />
</bean>
</property>
<property name="localizedLookup" value="false" />
</bean>