gpt4 book ai didi

spring-boot - 如何在 Spring Boot 2 中使全局共享对象可用于 freemarker 模板

转载 作者:行者123 更新时间:2023-12-03 21:18:57 25 4
gpt4 key购买 nike

在使用 Spring Boot 2.x 时,在不丢失 Spring Boot 的 FreeMarker 自动配置的情况下,使全局共享对象可用于 freemarker 模板的最佳方法是什么?

这样做的底层机制是 Spring Boot 的 FreeMakerConfigurer.setFreemarkerVariables , 进而调用 FreeMarker 的 Configuration.setAllSharedVariables

但是,(对我来说)没有明显的方法来修改由 FreeMarkerServletWebConfiguration 设置的 FreeMarkerConfigurer。超出 Spring Boot 支持的预定义 freemarker 属性。 (搜索“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 ,但我一直找不到。

最佳答案

I found a solution from spring git
Spring Boot 2.0 打破了@wo8335224 提供的解决方案,因为 FreeMarkerWebConfiguration 被 FreeMarkerServletWebConfiguration 取代,不幸的是它是包私有(private)的,因此不能被子类化。
当前可行的解决方案是配置 freemarker.template.Configuration bean:

@Configuration
public class FreemarkerConfig {
public FreemarkerConfig(freemarker.template.Configuration configuration) throws TemplateModelException {
configuration.setSharedVariable("name", "whatever type of value");
}
}
在内部,FreeMarkerConfigurer#setFreemarkerVariables 将其工作委托(delegate)给 freemarker.template.Configuration#setAllSharedVariables。

关于spring-boot - 如何在 Spring Boot 2 中使全局共享对象可用于 freemarker 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52730368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com