如何从 freemarker 模板访问 spring 引导属性
How to access spring boot properties from freemarker template
我的问题很简单:
在我的 spring-boot web 应用程序中,我有一些 front/client-side 需要知道的与环境相关的属性(比方说,一个 CORS 远程 url 来调用它取决于环境)。
我已经正确定义了我的 application-{ENV}.properties 文件,所有的 per-env-props 机制工作正常。
我似乎找不到答案的问题是:你如何让你的 freemarker 上下文知道你的属性文件以便能够注入它们(特别是在 spring-boot 应用程序中) .这可能很简单,但我找不到任何示例...
谢谢,
我会自己回答:
spring-boot 1.3 中最简单的方法是覆盖 FreeMarkerConfiguration class :
/**
* Overrides the default spring-boot configuration to allow adding shared variables to the freemarker context
*/
@Configuration
public class FreemarkerConfiguration extends FreeMarkerAutoConfiguration.FreeMarkerWebConfiguration {
@Value("${myProp}")
private String myProp;
@Override
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = super.freeMarkerConfigurer();
Map<String, Object> sharedVariables = new HashMap<>();
sharedVariables.put("myProp", myProp);
configurer.setFreemarkerVariables(sharedVariables);
return configurer;
}
}
spring 引导 2 中的一个选项:
@Configuration
public class CustomFreeMarkerConfig implements BeanPostProcessor {
@Value("${myProp}")
private String myProp;
@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("myProp", myProp);
configurer.setFreemarkerVariables(sharedVariables);
}
return bean;
}
}
Spring Boot 2.x 更改了 class 结构,因此不再可能像 Spring Boot 那样子 class 和保持自动配置1.x.
import freemarker.template.Configuration;
@Component
public class FreemarkerConfiguration {
@Autowired
private Configuration freemarkerConfig;
@Value("${myProp}")
private String myProp;
Map<String, Object> model = new HashMap();
model.put("myProperty", myProp);
// set loading location to src/main/resources
freemarkerConfig.setClassForTemplateLoading(this.getClass(), "/");
Template template = freemarkerConfig.getTemplate("template.ftl");
String templateText = FreeMarkerTemplateUtils.
processTemplateIntoString(template, model);
}
step 2,
get property in freemarker template code.
<div>${myProperty}</td>
我的问题很简单:
在我的 spring-boot web 应用程序中,我有一些 front/client-side 需要知道的与环境相关的属性(比方说,一个 CORS 远程 url 来调用它取决于环境)。
我已经正确定义了我的 application-{ENV}.properties 文件,所有的 per-env-props 机制工作正常。
我似乎找不到答案的问题是:你如何让你的 freemarker 上下文知道你的属性文件以便能够注入它们(特别是在 spring-boot 应用程序中) .这可能很简单,但我找不到任何示例...
谢谢,
我会自己回答:
spring-boot 1.3 中最简单的方法是覆盖 FreeMarkerConfiguration class :
/**
* Overrides the default spring-boot configuration to allow adding shared variables to the freemarker context
*/
@Configuration
public class FreemarkerConfiguration extends FreeMarkerAutoConfiguration.FreeMarkerWebConfiguration {
@Value("${myProp}")
private String myProp;
@Override
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = super.freeMarkerConfigurer();
Map<String, Object> sharedVariables = new HashMap<>();
sharedVariables.put("myProp", myProp);
configurer.setFreemarkerVariables(sharedVariables);
return configurer;
}
}
spring 引导 2 中的一个选项:
@Configuration
public class CustomFreeMarkerConfig implements BeanPostProcessor {
@Value("${myProp}")
private String myProp;
@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("myProp", myProp);
configurer.setFreemarkerVariables(sharedVariables);
}
return bean;
}
}
Spring Boot 2.x 更改了 class 结构,因此不再可能像 Spring Boot 那样子 class 和保持自动配置1.x.
import freemarker.template.Configuration;
@Component
public class FreemarkerConfiguration {
@Autowired
private Configuration freemarkerConfig;
@Value("${myProp}")
private String myProp;
Map<String, Object> model = new HashMap();
model.put("myProperty", myProp);
// set loading location to src/main/resources
freemarkerConfig.setClassForTemplateLoading(this.getClass(), "/");
Template template = freemarkerConfig.getTemplate("template.ftl");
String templateText = FreeMarkerTemplateUtils.
processTemplateIntoString(template, model);
}
step 2,
get property in freemarker template code.
<div>${myProperty}</td>