如何从freemarker模板访问spring boot属性

时间:2016-01-25 09:08:21

标签: java spring spring-boot freemarker

我的问题非常简单:

在我的spring-boot网络应用程序中,我有一些与前端/客户端需要知道的env相关属性(让我们说,一个CORS远程URL来调用env依赖)。 / p>

我已经正确定义了我的应用程序 - {ENV} .properties文件,并且所有per-env-props机制都运行良好。

我似乎无法回答的问题是:如何让您的freemarker上下文了解您的属性文件以便能够注入它们(特别是在spring-boot应用程序中)。这可能很容易,但我找不到任何例子......

谢谢,

2 个答案:

答案 0 :(得分:4)

要回答自己:

spring-boot 1.3中最简单的方法是覆盖FreeMarkerConfiguration类:

/**
 * 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;
    }
}

答案 1 :(得分:3)

Spring Boot 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更改了类结构,因此不再像在Spring Boot 1.x中那样可以继承并保持自动配置。