使用 Spring MVC 处理 Freemarker 模板错误
Freemarker template error handling with Spring MVC
我在 Spring MVC 中使用 Freemarker 模板。如果呈现模板有任何错误,有没有办法 return HTTP Status 500?
目前我正在使用尝试块来处理错误,但想抛出内部服务器错误并允许 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>
servlet-context.xml 中的以下更改解决了该问题。现在它抛出被 Web 服务器拦截的 HTTP 500 错误,我可以通过重定向到预定义的错误页面来发布消息。
<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>
这是 java-based 等效配置:
@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;
}
将模式从 "debug" 更改为 "rethrow" 的一种简单方法是在 application.properties 中进行配置:
spring.freemarker.settings.template_exception_handler=rethrow
我在 Spring MVC 中使用 Freemarker 模板。如果呈现模板有任何错误,有没有办法 return HTTP Status 500?
目前我正在使用尝试块来处理错误,但想抛出内部服务器错误并允许 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>
servlet-context.xml 中的以下更改解决了该问题。现在它抛出被 Web 服务器拦截的 HTTP 500 错误,我可以通过重定向到预定义的错误页面来发布消息。
<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>
这是 java-based 等效配置:
@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;
}
将模式从 "debug" 更改为 "rethrow" 的一种简单方法是在 application.properties 中进行配置:
spring.freemarker.settings.template_exception_handler=rethrow