Как получить Restlet 'Context' для определения бина в Spring? - PullRequest
0 голосов
/ 01 апреля 2012

Я пытаюсь инициализировать и кэшировать экземпляр конфигурации Freemarker для использования в моем приложении Restlet. Проблема в том, что ContextTemplateLoader принимает аргумент типа org.restlet.Context, который доступен через вызов метода getContext() в приложении. Как можно получить доступ к этому контексту «внутри» контейнера Spring, где Restlet является «основным контейнером» (т. Е. Это приложение рестлета, которое использует Spring, а не наоборот)?

А пока я кеширую конфигурацию 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;
    }

Я бы лично предпочел, чтобы конфигурация freemarker была кеширована самой Spring, но ContextTemplateLoader требует Context, и это недоступно вне приложения. Наличие статического метода выглядит как хак.

Каков самый простой / простой / самый чистый способ создания экземпляра freemarker в Spring?

Причина: бессмысленно загружать конфигурацию перед каждым доступом к шаблону (шаблонам), и лучше ее кешировать. Было бы здорово, если бы это можно было определить в самой Spring, а IoC только что был создан в org.restlet.Component

Кажется, есть статический метод Context.getCurrent(), который можно использовать для извлечения текущего контекста, но я не знаю, как вызвать его через пружину (если вообще). Я не заинтересован в том, чтобы иметь Spring MVC libs и т. Д., Просто чтобы создать экземпляр конфигурации freemarker (есть способов сделать это , но я не хочу связанных с Spring сервлетов и т. Д.)

1 Ответ

0 голосов
/ 31 мая 2012

Как насчет этого, используя язык выражений Spring и предполагая, что у вас есть bean-компонент org.restlet.Application с именем application:

<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>
...