先说一句:如果您只需要一个“静态”错误页面,而不需要太多的逻辑和模型准备,那么在web.xml
中添加一个
-标记就足够了(参见下面的示例)。
否则,可能会有更好的方法来做到这一点,但这对我们很有效:
我们在web.xml
中使用servlet
,该servlet
捕获所有异常并调用自定义的ErrorHandler,与我们在Spring HandlerExceptionResolver中使用的相同。
<filter>
<filter-name>errorHandlerFilter</filter-name>
<filter-class>org.example.filter.ErrorHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该实现基本上如下所示:
public class ErrorHandlerFilter implements Filter {
ErrorHandler errorHandler;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
// call ErrorHandler and dispatch to error jsp
String errorMessage = errorHandler.handle(request, response, ex);
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
errorHandler = (ErrorHandler) WebApplicationContextUtils
.getRequiredWebApplicationContext(filterConfig.getServletContext())
.getBean("defaultErrorHandler");
}
// ...
}
我相信这对于FreeMarker模板应该是一样的。当然,如果错误视图抛出错误,您或多或少别无选择。
为了捕获类似404的错误并为此准备模型,我们使用映射到error
调度程序的过滤器:
<filter>
<filter-name>errorDispatcherFilter</filter-name>
<filter-class>org.example.filter.ErrorDispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
// handle code(s)
final int code = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (code == 404) {
final String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
request.setAttribute("errorMessage", "The requested page '" + uri + "' could not be found.");
}
// notify chain
filterChain.doFilter(servletRequest, servletResponse);
}
问题内容: 朋友们,美好的一天! 首先,对不起我的英语。这是我的问题: 我是JSF(2.0)的新手,我正尝试使用BalusC算法从托管bean下载文件。功能正常运行,浏览器中出现“另存为…”对话框。但是我不知道如何在不重新加载/重定向视图的情况下返回文件下载错误消息(后备bean方法中的异常,DB错误等)。 我在视图上的隐藏按钮: 我的托管bean(我可以使用哪个范围?我尝试过请求并查看范围)方法
我在Android Studio中创建一个项目时遇到了一个问题。(版本1.5.1) 我一步一步地描述我的行动: null 会有什么问题?
我正在处理一个Spring启动应用程序。我尝试处理异常。但我想我这样做的方式有问题,因为它总是抛出内部服务器错误500。 我尝试设置自定义异常类,并且还使用带有@响应状态的响应状态代码。但是不管异常是什么,它只会抛出内部服务器错误。我使用的是intellij,我在异常中给出的消息打印在那里,但响应正文empty.This我想一定是因为它抛出了内部服务器错误。 控制器类 intellij 中的终端打
考虑以下示例: 这将输出从1到5的数字,然后打印异常。 我想要实现的是使观察器保持订阅状态,并在抛出异常后继续运行,即打印从1到10的所有数字。 我尝试过使用和其他各种错误处理操作符,但正如文档中所述,它们的目的是处理可观察对象本身发出的错误。 最直接的解决方案是将的整个主体包装成一个try-catch块,但对我来说这听起来不是一个好的解决方案。在类似的Rx中。NET问题,提出的解决方案是制作一个
问题内容: 我有一个使用FreeMarker作为View技术的Spring MVC应用程序(但是也许对我的问题来说,视图技术并不重要)。我需要拦截在请求期间可能引发的所有异常。 我已经实现了HandlerExceptionResolver,但是仅当控制器中发生异常时才执行此解析器。但是,当控制器返回ModelAndView且呈现视图时发生异常(因为未找到变量或类似的东西),则不调用异常解析器,而是
所以,场景是我正在做一些数据库操作,最后提交/回滚,然后连接关闭。但是连接关闭也会抛出SQLException。 在这种情况下,最好的方法是什么? 捕获并记录它。 捕获并抛出异常,以便调用函数可以处理它 在#1的情况下,调用函数永远不会知道出了问题。