SpringMVC全局异常处理小结
作者:周大福ye
一、为什么要全局异常处理?
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
二、异常处理思路(参考下图)
三、SpringMVC异常分类
1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3)使用@ControllerAdvice + @ExceptionHandler
四、综合案例
1、首先创建一个error页面,为方便后面异常处理操作
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1> 系统错误,请联系管理员!! </h1> ${msg} </body> </html>
4.1 SpringMVC自带的简单异常处理器
SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口
1)配置SpringMVC简单异常处理器
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定义默认的异常处理页面 --> <property name="defaultErrorView" value="error"/> <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/> <!-- 定义需要特殊处理的异常,这是重要点 --> <property name="exceptionMappings"> <props> <!--异常类型 错误视图--> <prop key="java.lang.RuntimeException">error</prop> </props> <!-- 还可以定义其他的自定义异常 --> </property> </bean>
2)方法中抛出此异常
/** * 返回实体类的JSON数据 * @param bookId * @return */ @RequestMapping("/querySingleBook") @ResponseBody public Book querySingleBook(Integer bookId){ Book book = bookService.selectByPrimaryKey(bookId); book.setCreatedate(new Date()); //此处只是为了进行案例演示 if(bookId<100){ throw new RuntimeException("查询的书本编号小于100,异常抛出!!"); } return book; }
3)页面效果
4.2 通过HandlerExceptionResovler接口实现全局异常
注:
1)通过instanceof判断异常类型
2)通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据;
1)通过HandlerExceptionResovler接口实现全局异常处理器
package com.zking.ssm.book.exception; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * SpingMVC提供的第二种全局异常处理方式 ,实现HandlerExceptionResolver接口 */ @Component public class GlobalException implements HandlerExceptionResolver { /** * * @param httpServletRequest * @param httpServletResponse * @param o 异常处理的目标 * @param e 异常处理的类型 * @return */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv=new ModelAndView(); mv.setViewName("error"); //判断异常的分类 if(e instanceof RuntimeException){ RuntimeException ex=(RuntimeException)e; System.out.println(ex.getMessage()); mv.addObject("msg",ex.getMessage()); } return mv; } }
2)创建异常类
package com.zking.ssm.book.exception; public class BusinessException extends RuntimeException { public BusinessException() { } public BusinessException(String message) { super(message); } public BusinessException(String message, Throwable cause) { super(message, cause); } public BusinessException(Throwable cause) { super(cause); } }
@RequestMapping("/querySingleBook") @ResponseBody public Book querySingleBook(Integer bookId){ Book book = bookService.selectByPrimaryKey(bookId); if(bookId>100) throw new BusinessException("书本编号小于100,异常抛出!!!"); book.setDate(new Date()); return book; }
3)页面效果
4.3 使用@ControllerAdvice+@ExceptionHandler实现全局异常
1)创建全局异常处理器
package com.zking.ssm.book.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import java.util.HashMap; import java.util.Map; /** * SpingMVC提供的第三种种全局异常处理方式 * 1)@ControllerAdvice +@ExceptionHandler * 2)@RestControllerAdvice +@ExceptionHandler * @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器 */ @ControllerAdvice public class GlobalException2{ @ExceptionHandler public ModelAndView exceptionHandler(Exception e){ ModelAndView mv=new ModelAndView(); //设置错误页面 mv.setViewName("error"); //判断异常类型 if(e instanceof BusinessException){ BusinessException ex=(BusinessException)e; mv.addObject("msg","系统繁忙,请稍后再试......."); } mv.setView(new MappingJackson2JsonView()); return mv; } }
2)页面效果
3)返回异常信息和状态码、返回JSON数据格式
package com.zking.ssm.book.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import java.util.HashMap; import java.util.Map; /** * SpingMVC提供的第三种种全局异常处理方式 * 1)@ControllerAdvice +@ExceptionHandler * 2)@RestControllerAdvice +@ExceptionHandler * @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器 */ @RestControllerAdvice public class GlobalException2{ @ExceptionHandler public Map<String, Object> exceptionHandler(Exception e){ Map<String, Object> json=new HashMap(); //判断异常类型 if(e instanceof BusinessException){ json.put("msg","系统繁忙,请稍后再试......."); json.put("code",500); } return json; } }
4)页面效果
希望可以给您带来帮助,若有建议可以私信作者哦~
到此这篇关于SpringMVC之全局异常处理的文章就介绍到这了,更多相关SpringMVC全局异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!