Spring Boot 1.5.2 FreeMarker 从 DEBUG 模式更改为 RETHROW 模式

Spring Boot 1.5.2 FreeMarker change from DEBUG mode to RETHROW mode

如何在 Spring Boot 1.5.2 中将 FreeMarker "DEBUG" 模式更改为 "RETHROW" 模式。发生异常时,我在浏览器中收到以下消息:

FreeMarker template error (DEBUG mode; use RETHROW in production!)

我尝试将以下 属性 添加到 application.properties 文件:

spring.freemarker.template_exception_handler=rethrow

根据以下网站:http://blog.64p.org/entry/2016/03/24/175906 但这没有用。

编辑:

我看到有一个名为 FreeMarkerProperties 的 class 具有如下 class 定义:

@ConfigurationProperties(prefix = "spring.freemarker")
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {

我认为这个 class 应该填充以 "spring.freemarker"

开头的所有属性

它有一个名为 getSettings 的方法。如果我将 FreeMarkerProperties 自动连接到我的 CommandLineRunner,我决定看看 returns 是什么。

我将实现 CommandLineRunner 的 class 更改为以下内容:

@Component 
public class ApplicationLoader implements CommandLineRunner {

    private static final Logger logger =     LoggerFactory.getLogger(ApplicationLoader.class);

    ...

    @Autowired
    FreeMarkerProperties properties;

    @Override
    @Transactional
    public void run(String... strings) throws Exception {
        StringBuilder sb = new StringBuilder();
        for (String option : strings) {
            sb.append(" ").append(option);
        }
        sb = sb.length() == 0 ? sb.append("No Options Specified") : sb;
        logger.info(String.format("WAR launched with following options: %s", sb.toString()));

        logger.info("FREEMARKER PROPERTIES");
        for(String path : properties.getTemplateLoaderPath()) {
            logger.info(path);
        }

        for(String setting : properties.getSettings().keySet()) {
            logger.info("Freemarker: " + setting);
        }

输出如下:

2017-03-22 09:58:19.257  INFO 6635 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-03-22 09:58:19.292  INFO 6635 --- [           main] com.example.ApplicationLoader            : WAR launched with following options: No Options Specified
2017-03-22 09:58:19.292  INFO 6635 --- [           main] com.example.ApplicationLoader            : FREEMARKER PROPERTIES
2017-03-22 09:58:19.292  INFO 6635 --- [           main] com.example.ApplicationLoader            : classpath:/templates/
2017-03-22 09:58:19.852  INFO 6635 --- [           main] com.example.DemoApplication              : Started DemoApplication in 11.67 seconds (JVM running for 12.339)

所以看起来 FreemarkerProperties 的 getSettings 方法 returns 是一个空的设置列表。我的 application.properties:

# Spring Boot configuration.
# Uncomment below line to enable mobile device detection.
#spring.mobile.devicedelegatingviewresolver.enabled: true
spring.metrics.export.delay-millis=10000
spring.datasource.url=jdbc:postgresql://localhost:5432/**COMMENTED OUT***
spring.datasource.username=*
spring.datasource.password=*
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=create
server.session.timeout=1800
spring.freemarker.template_exception_handler=rethrow

我是不是做错了什么?为什么设置未填充到 FreemarkerProperties class?

在我的一个应用程序的 Spring 引导模块中,我正在加载带有 @PropertySource 注释的 Freemarker 属性文件。

@SpringBootApplication
@PropertySource("classpath:/standalone.properties")
public class MailLauncher {

    public static void main(String[] args) {

        ApplicationContext ctx = new
                AnnotationConfigApplicationContext("com.nixmash.blog.mail",
                "com.nixmash.blog.jpa");

        MailDemo demo = ctx.getBean(MailDemo.class);
        demo.init();
        ((ConfigurableApplicationContext) ctx).close();
    }

}

我没有扩展 AbstractTemplateViewResolverProperties 而是使用配置 Bean

@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setPrefix("");
    resolver.setCache(false);
    resolver.setOrder(3);
    return resolver;
}

这是 .properties 文件。

spring.freemarker.enabled=false
spring.freemarker.template-loader-path=classpath:/freemarker/
spring.freemarker.charset=UTF-8
spring.freemarker.cache=false
spring.freemarker.check-template-location=false
spring.freemarker.settings.locale=en_US

如果您的应用程序包含多个模块和 application.properties 文件,也可能是一个模块 .properties 文件覆盖了您的 FreeMarker 模块 .properties 文件。在这种情况下,重命名 FreeMarker 模块 .properties 文件并使用 @PropertySource 将公开属性。

在你的 application.properties 中尝试使用 spring.freemarker.settings.template_exception_handler=rethrow