【发布时间】:2018-10-09 22:55:32
【问题描述】:
在使用 Spring Boot 2.x 时,在不丢失 Spring Boot 的 FreeMarker 自动配置的情况下,使全局共享对象可用于 freemarker 模板的最佳方法是什么?
执行此操作的底层机制是 Spring Boot 的 FreeMakerConfigurer.setFreemarkerVariables,而后者又调用 FreeMarker 的 Configuration.setAllSharedVariables
但是,除了 Spring Boot 支持的预定义 freemarker 属性之外,没有明显的方法(对我而言)来修改由 FreeMarkerServletWebConfiguration 设置的 FreeMarkerConfigurer。 (搜索“freemarker”here)。
一种常见的方法是创建一个自定义的FreemarkerConfigurer bean,但我相信这样会丢失一些spring boot 提供的自动配置,尤其是在处理各种外部属性方面。
似乎可行的一个选项是使用这样的 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,但我一直没能找到它。
【问题讨论】: