Spring-MVC开发之全局异常捕获全面解读(转)

异常,异常。我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个!产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息!在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种:

  • WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法
  • 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等。

SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉,互相没有依赖,每个都可单独使用!

1、定义服务器错误WEB.XML整合Spring MVC

web.xml:

 1 <error-page>
 2     <error-code>404</error-code>
 3     <location>/404</location>
 4 </error-page>
 5 <error-page>
 6     <error-code>500</error-code>
 7     <location>/500</location>
 8 </error-page>
 9
10 <!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 -->
11 <error-page>
12     <exception-type>java.lang.Exception</exception-type>
13     <location>/uncaughtException</location>
14 </error-page>

applicationContext.xml:

1 <!-- 错误路径和错误页面,注意指定viewResolver -->
2 <mvc:view-controller path="/404" view-name="404"/>
3 <mvc:view-controller path="/500" view-name="500"/>
4 <mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>

 2、Spring全局异常,Controller增强方式( Advising Controllers)

异常抛出:

1 @Controller
2 public class MainController {
3     @ResponseBody
4     @RequestMapping("/")
5     public String main(){
6         throw new NullPointerException("NullPointerException Test!");
7     }
8 }

异常捕获:

 1 //注意使用注解@ControllerAdvice作用域是全局Controller范围
 2 //可应用到所有@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler
 3 @ControllerAdvice
 4 public class AControllerAdvice {
 5     @ExceptionHandler(NullPointerException.class)
 6     @ResponseStatus(HttpStatus.BAD_REQUEST)
 7     @ResponseBody
 8     public String handleIOException(NullPointerException ex) {
 9         return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
10     }
11 }

为了防止@ResponseStatus标注的异常被Spring框架处理,可以这样编写全局异常处理类:

 1 @ControllerAdvice
 2 class GlobalDefaultExceptionHandler {
 3     public static final String DEFAULT_ERROR_VIEW = "error";
 4
 5     @ExceptionHandler(value = Exception.class)
 6     public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
 7         // If the exception is annotated with @ResponseStatus rethrow it and let
 8         // the framework handle it - like the OrderNotFoundException example
 9         // at the start of this post.
10         // AnnotationUtils is a Spring Framework utility class.
11         if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
12             throw e;
13
14         // Otherwise setup and send the user to a default error-view.
15         ModelAndView mav = new ModelAndView();
16         mav.addObject("exception", e);
17         mav.addObject("url", req.getRequestURL());
18         mav.setViewName(DEFAULT_ERROR_VIEW);
19         return mav;
20     }
21 }

3、Spirng全局异常,配置方式

异常抛出,同上!

异常捕获:

 1 <!-- 全局异常配置 -->
 2     <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 3         <property name="exceptionMappings">
 4             <props>
 5                 <prop key="java.lang.Exception">errors/500</prop>
 6                 <prop key="java.lang.Throwable">errors/500</prop>
 7             </props>
 8         </property>
 9         <property name="statusCodes">
10             <props>
11                 <prop key="errors/500">500</prop>
12             </props>
13         </property>
14         <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
15         <property name="warnLogCategory" value="WARN"></property>
16         <!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
17         <property name="defaultErrorView" value="errors/500"></property>
18         <!-- 默认HTTP状态码 -->
19         <property name="defaultStatusCode" value="500"></property>
20     </bean>

对应500错误的view jsp页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>500 Error</title>
 8 </head>
 9 <body>
10     <% Exception ex = (Exception)request.getAttribute("exception"); %>
11     <H2>Exception: <%= ex.getMessage()%></H2>
12     <P/>
13     <% ex.printStackTrace(new java.io.PrintWriter(out)); %>
14 </body>
15 </html>

4、Sping全局异常,自定义异常类和异常解析
自定义异常类:

 1 public class CustomException extends RuntimeException {
 2
 3     public CustomException(){
 4         super();
 5     }
 6
 7     public CustomException(String msg, Throwable cause){
 8         super(msg, cause);
 9         //Do something...
10     }
11 }

抛出异常:

1 @ResponseBody
2 @RequestMapping("/ce")
3 public String ce(CustomException e){
4     throw new CustomException("msg",e);
5 }

实现异常捕获接口HandlerExceptionResolver:

 1 public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{
 2
 3     @Override
 4     public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
 5         Map<String, Object> model = new HashMap<String, Object>();
 6         model.put("e", e);
 7         //这里可根据不同异常引起类做不同处理方式,本例做不同返回页面。
 8         String viewName = ClassUtils.getShortName(e.getClass());
 9         return new ModelAndView(viewName, model);
10     }
11 }

新的的HandlerExceptionResolver实现类只需在配置文件中定义即可,可以配置优先级。DispatcherServlet初始化HandlerExceptionResolver的时候会自动寻找容器中实现了HandlerExceptionResolver接口的类,然后添加进来。配置Spring支持异常捕获:

1 <bean class="cn.bg.controller.CustomHandlerExceptionResolver"/>

5、Errors and REST

使用Restful的Controller可以使用@ResponseBody处理错误,首先定义一个错误:

1 public class ErrorInfo {
2     public final String url;
3     public final String ex;
4
5     public ErrorInfo(String url, Exception ex) {
6         this.url = url;
7         this.ex = ex.getLocalizedMessage();
8     }
9 }

通过一个@ResponseBody返回一个错误实例:

1 @ResponseStatus(HttpStatus.BAD_REQUEST)
2 @ExceptionHandler(MyBadDataException.class)
3 @ResponseBody ErrorInfo handleBadRequest(HttpServletRequest req, Exception ex) {
4     return new ErrorInfo(req.getRequestURL(), ex);
5 } 

6、参考:

原文:Spring-MVC开发之全局异常捕获全面解读

[Spring MVC] - 500/404错误处理

Exception Handling in Spring MVC

时间: 2024-10-24 18:14:28

Spring-MVC开发之全局异常捕获全面解读(转)的相关文章

Spring-MVC开发之全局异常捕获全面解读

在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种, WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等. SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉 互相没有依赖,每个都可单独使用! 定义服务器错误WEB.XML整合Spring MVC web.xml <error-page> <

MVC 好记星不如烂笔头之 ---&gt; 全局异常捕获以及ACTION捕获

public class BaseController : Controller { /// <summary> /// Called after the action method is invoked. /// </summary> /// <param name="filterContext">Information about the current request and action.</param> protected ov

spring boot2.0+中添加全局异常捕获

1.添加自定义异常,继承RuntimeException,为什么继承RuntimeException呢?是因为我们的事务在RuntimeException异常下会发生回滚. 1 public class BusinessException extends RuntimeException{ 2 3 public BusinessException(String code, String msg){ 4 this.code = code; 5 this.msg = msg; 6 } 7 8 pri

自定义全局异常捕获

原文:http://blog.csdn.net/jinzhencs/article/details/51700009 第一种:实现HandlerExceptionResolver 注意: 把错误码 重设成200,不然还是返回的异常信息. 注解@Compoment交由spring创建bean 之后就能愉快的返回自己的错误码了. 或者记录错误日志. /** * 全局异常捕获 * @author Mingchenchen * */ @Component public class GlobleExcep

C#中的那些全局异常捕获

1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异常由应用程序引发但未进行处理时发生.主要指的是UI线程. this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); //  当某

Maven+Hibernate+Spring+Spring MVC开发新闻发布系统

使用Maven+Hibernate+Spring+Spring MVC开发新闻发布系统 课程学习地址:http://www.xuetuwuyou.com/course/163 课程出自学途无忧网:http://www.xuetuwuyou.com 课程介绍 一.课程用到的软件: 1.jdk 1.8 2.eclipse neon 3.tomcat 8 4.jetty 5.MySQL  6.navicat 9+ 二.课程涉及到的技术点 1.Maven基础 2.Maven高级 3.Hibernate

用Spring MVC开发简单的Web应用

这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录. 问题:想用Spring MVC开发一个简单的Web应用, 学习这个框架的基本概念和配置. 解决方案: Spring MVC的核心组件是一个控制器(大多数框架都是控制器比较重要吧). 在最简单的Spring MVC应用中,控制器是需要在web.xml文件中配置的唯一Servlet. Spring MVC的控制器通常称作请求分发Servlet(Dispatcher

spring mvc开发入门实例demo源代码下载,很适合新手入门学习用。

原文:spring mvc开发入门实例demo源代码下载,很适合新手入门学习用. 源代码下载:http://www.zuidaima.com/share/1550463469046784.htm Eclipse + Maven + Spring MVC - Simple Example 源代码框架截图:

Configure、中间件与ErrorHandlingMiddleware全局异常捕获

一.Configure Startup.cs中的Configure方法主要是http处理管道配置.中间件和一些系统配置,其中 IApplicationBuilder: 定义一个类,该类提供配置应用程序请求的机制管道.通过IApplicationBuilder下的run.use方法传入管道处理方法.这是最常用方法,对于一个真实环境的应用基本上都需要比如权限验证.跨域.异常处理等. IHostingEnvironment:提供有关正在运行的应用程序的web托管环境的信息 简单来说Configure方