Вместо использования страниц ошибок web.xml вы можете использовать фильтр сервлетов.Фильтр сервлета может использоваться для перехвата всех исключений или только определенного исключения, такого как org.springframework.web.portlet.NoHandlerFoundException.(Это то, что вы подразумеваете под исключением «обработчик не найден»?)
Фильтр будет выглядеть примерно так:
package com.example;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.portlet.NoHandlerFoundException;
public class ErrorHandlingFilter implements Filter {
public void init(FilterConfig config) throws ServletException { }
public void destroy() { }
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
try {
chain.doFilter(request, response);
} catch (NoHandlerFoundException e) {
// Or you could catch Exception, Error, Throwable...
// You probably want to add exception logging code here.
// Putting the exception into request scope so it can be used by the error handling page
request.setAttribute("exception", e);
// You probably want to add exception logging code here.
request.getRequestDispatcher("/WEB-INF/view/servlet-exception.vm").forward(request, response);
}
}
}
Затем настройте это в web.xml с помощьюSpring's DelegatingFilterProxy:
<filter>
<filter-name>errorHandlingFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
И, наконец, превратите фильтр в пружинный компонент внутри контекста Spring. xml:
<bean id="errorHandlingFilter" class="com.example.ErrorHandlingFilter" />
Возможно, вам придется поэкспериментировать с порядком фильтра.в цепочке фильтров, чтобы неудавшиеся запросы все равно проходили через другие фильтры, которые вы упомянули.Если у вас возникли проблемы с этим, можно было бы сделать перенаправление HTTP вместо переадресации, например:
try {
chain.doFilter(request, response);
} catch (NoHandlerFoundException e) {
request.getSession().setAttribute("exception", e);
response.sendRedirect("/servlet-exception.vm");
}
Это заставило бы браузер запросить страницу обработки ошибок в качестве нового httpзапрос, который может упростить гарантию, что сначала он проходит через все нужные фильтры.Если вам нужен исходный объект исключения, то вы можете поместить его в сеанс вместо запроса.