Spring Boot 1.5.2 FreeMarker从DEBUG模式切换到RETHROW模式

时间:2017-03-21 05:43:16

标签: spring spring-mvc spring-boot freemarker

如何在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的类,其类定义如下:

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

我认为这个类应该填充所有以“spring.freemarker”

开头的属性

它有一个名为getSettings的方法。如果我将FreeMarkerProperties自动装入我的CommandLineRunner,我决定看看返回什么。

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

@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方法返回一个空的设置列表。我的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类中没有填充设置?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在我的某个应用程序的Spring Boot Module中,我正在使用@PropertySource注释加载Freemarker Properties文件。

@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会公开属性。