使用Spring MVC处理Freemarker模板错误

时间:2015-05-24 18:18:30

标签: spring-mvc freemarker

我在Spring MVC中使用Freemarker模板。如果呈现模板有任何错误,有没有办法返回HTTP状态500?

目前我正在使用attempt block来处理错误,但是想要抛出Internal Server错误并允许Web服务器重定向到默认错误页面

<#attempt>
  attempt block
<#recover>
  recover block
</#attempt>

下面是我的 servlet-context.xml                   

<beans:bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <beans:property name="cache" value="true" />
    <beans:property name="prefix" value="" />
    <beans:property name="contentType" value="text/html; charset=UTF-8" />
    <beans:property name="suffix" value=".ftl" />
    <beans:property name="exposeSessionAttributes" value="true" />
</beans:bean>

3 个答案:

答案 0 :(得分:3)

servlet-context.xml下面的更改解决了这个问题。现在它抛出HTTP 500错误,这是由Web服务器截获的,我可以通过重定向到预定义的错误页面来填充消息。

<beans:bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <beans:property name="templateLoaderPath" value="/WEB-INF/ftl/" />
        <beans:property name="freemarkerSettings">
            <beans:props>
                <beans:prop key="template_exception_handler">rethrow</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>

答案 1 :(得分:0)

这是基于java的等效配置:

@Bean 
public FreeMarkerConfigurer freemarkerConfig() throws TemplateException { 
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
    freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/ftl/");

    Properties settings = new Properties();
    settings.setProperty(freemarker.template.Configuration.TEMPLATE_EXCEPTION_HANDLER_KEY, "rethrow");
    freeMarkerConfigurer.setFreemarkerSettings(settings);
    return freeMarkerConfigurer; 
}

答案 2 :(得分:0)

将模式从“debug”更改为“rethrow”的简单方法是在application.properties中配置它:

spring.freemarker.settings.template_exception_handler=rethrow