Каков наилучший способ сделать глобальные общие объекты доступными для шаблонов 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
, но я не смог его найти.