Как сделать объекты общего доступа доступными для шаблонов freemarker в Spring Boot 2 - PullRequest
0 голосов
/ 10 октября 2018

Каков наилучший способ сделать глобальные общие объекты доступными для шаблонов freemarker при использовании Spring Boot 2.x без потери автоматической конфигурации Spring Boot FreeMarker?

Основным механизмом для этого является Spring Boot FreeMakerConfigurer.setFreemarkerVariables, который, в свою очередь, вызывает FreeMarker Configuration.setAllSharedVariables

Однако нет очевидного (для меня) способа изменить FreeMarkerConfigurer, настроенный с помощью FreeMarkerServletWebConfiguration помимо предопределенных свойств freemarker, которые поддерживает Spring Boot.(Ищите «freemarker» здесь ).

Общий подход заключается в создании пользовательского компонента FreemarkerConfigurer, но я полагаю, что тогда теряется часть автоматической конфигурации, предоставляемой весенней загрузкой,особенно в отношении обработки различных внешних свойств.

Один вариант, который, кажется, работает, - это использовать BeanPostProcessor, например, так:

public class CustomFreeMarkerConfig implements BeanPostProcessor {

    Object sharedWithAllFreeMarkerTemplatesObj = new Object();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
    throws BeansException {

        if (bean instanceof FreeMarkerConfigurer) {
            FreeMarkerConfigurer configurer = (FreeMarkerConfigurer) bean;

            Map<String, Object> sharedVariables = new HashMap<>();
            sharedVariables.put("obj", sharedWithAllFreeMarkerTemplatesObj);
            configurer.setFreemarkerVariables(sharedVariables);
        }

        return bean;
    }
}

Кажется, должен быть более чистый способ сделать этоВозможно, каким-то образом расширив или настроив FreeMarkerConfigurationFactory, но я не смог его найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...