Как получить доступ к Spring RequestContext из Freemarker TemplateDirectiveModel - PullRequest
4 голосов
/ 26 мая 2011

Я использую Spring MVC с Freemarker в качестве технологии просмотра.У меня есть объект TemplateDirectiveModel, которому требуется доступ к SpringContext внутри метода execute.В настоящее время я делаю это так:

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();
    }
}

Но я не могу поверить, что это правильный способ сделать это.У меня такое чувство, что я пропустил что-то важное.Может быть, есть специальные классы и аннотации для обработки директив Freemarker в Spring?Может быть, я могу позволить Spring вставить что-то в класс директивы, с помощью которого я могу получить доступ к области запроса Springs?

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Есть более простой способ сделать это. Если вы уже используете 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>

Теперь по крайней мере в классе, который расширяет метод execute TemplateDirectiveModel, у вас есть доступ к этому внедренному свойству.

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

и в него будут автоматически вставлены зависимости пружины.

0 голосов
/ 10 июня 2011

Вы можете создать подкласс FreeMarkerConfigurer, переопределяя его postProcessConfiguration(Configuration config) метод.Ваша реализация просто поместит зависимую от запроса зависимость в конфигурацию, например совместно используемую переменную (как это предусмотрено в документации FM ).

Следует выполнитьтрюк в стиле весны ...

...