2015-05-24 6 views
1

Я использую шаблон Freemarker с Spring MVC. Есть ли способ вернуть HTTP-статус 500, если есть какая-либо ошибка, отображающая шаблон?Обработка ошибок шаблона Freemarker с Spring MVC

В настоящее время я использую попытку блок для обработки ошибки, но хотел бы бросить Внутреннюю ошибку сервера и позволяет веб-сервер для перенаправления на страницу ошибки по умолчанию

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

Ниже мой сервлет-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> 
+0

Что делает Spring MVC, если шаблон генерирует исключение? – ddekany

+0

@ddekany: после запроса делегата контроллера на просмотр, просмотр ошибок не обрабатывается Spring MVC. Здесь представление создается с использованием шаблона freemarker. –

ответ

3

Ниже изменения в сервлет-context.xml решен вопрос. Теперь он выдает ошибку 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> 
+2

Таким образом, проблема заключалась в том, что вы были в режиме debug (режим разработки, который избавляет вас от копирования журналов), что по умолчанию (к сожалению, наследие ...). Обратите внимание, что если вы использовали FreeMarker 2.3.23, в верхней части сообщения об ошибке говорится, что «ошибка шаблона FreeMarker (режим DEBUG; использование RETHROW на производстве!)», Поэтому вы можете решить эту проблему с меньшими потерями времени. – ddekany

+0

@ddekany: спасибо за ваш ответ, я обновлю до 2.3.23 –

+0

@ddekany: Я не смог найти FreeMarker 2.3.23 в maven. На стадии разработки? –

0

Это Яве эквивалент конфигурации:

@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; 
} 
0

Простой способ изменить режим с «отладки» до «Rethrow» необходимо настроить его в ваших application.properties:

spring.freemarker.settings.template_exception_handler=rethrow 
Смежные вопросы