Как исключить фильтр sitemesh при разрешении ошибки весной?

У меня есть фильтр Sitemesh, который будет украшать страницы. Я настроил весну exceptionResolver так что все ошибки перейдут к представлению под названием error который затем указывает на WEB-INF/jsp/error.jsp через InternalResourceViewResolver,

Теперь страница с ошибкой оформлена сайтом Sitemesh, и я бы хотел исключить ее из оформления. С помощью <exclude> тег sitemesh decorator.xml не работает. Потому что входящий URL может быть таким же нормальным, как /app/login.html а сайтеш уже поймал и украсил.

Я замечаю, что весной, если у меня есть @ResponseBody для запроса AJAX, он будет проходить мимо украшения Ситемеша. Интересно, как это работает? Могу ли я сделать что-то в errorResolver обойти сайтмешь тоже?

2 ответа

Это может быть сделано путем реализации собственного exceptionResolver, потокового вывода вручную и вернуть ноль ModelAndView

public class MyExceptionResolver extends SimpleMappingExceptionResolver{
public ModelAndView resolveException(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception ex) {

    //other things like logging...
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/error.jsp");
    try {
        dispatcher.forward(request, response);
        response.getOutputStream().flush();
    } catch (ServletException e) {
        log.error(e);
    } catch (IOException e) {
        log.error(e);
    }
    return null;
}

По крайней мере, в SiteMesh 3 этот тип исключаемых работ (sitemesh3.xml)

<sitemesh>
  <mime-type>text/html</mime-type>

  <mapping path="/*" decorator="/WEB-INF/sitemesh/decorator.jsp" />
  <mapping path="/app/login.html" exclude="true"/>

</sitemesh>

Это попробовали весной 3. Надеюсь, это помогло вам.

Другие вопросы по тегам