使用SpringMVC统一处理异常
文章目录
创建maven工程导入依赖准备工作
-
导入依赖
<dependencies> <!-- spring-webmvc依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.16.RELEASE</version> </dependency> <!-- 使用servlet组件 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- 返回json格式数据 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency> </dependencies>
-
创建spring的核心配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描注解--> <context:component-scan base-package="com.liu.controller,com.liu.exception"/> <!-- 添加处理器映射器--> <mvc:annotation-driven/> <!-- 添加视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 静态资源放行--> <mvc:default-servlet-handler/> </beans>
-
在web.xml中配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置前端控制器 就是配置servlet--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置servlet的初始化参数--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- DispatcherServlet 可以配置 / 和 /* 可以拦截所有资源 1.配置/,不会拦截jsp 2.配置/*,会拦截所有资源 如果没有使用jsp使用哪个都可以 --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
在webapp下的WEB-INF创建error文件夹error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> error.... </body> </html>
实现统一处理的三种方式:
方式一:使用servlet的知识
- 在web.xml配置
<error-page>
<location>/WEB-INF/error/error.jsp</location>
</error-page>
-
创建ErrorController类
@Controller @RequestMapping public class ErrorController { @GetMapping("error") public String error(){ int i=1/0;//制造异常 return "success"; } }
-
在url发起请求localhost:8080/error,则会跳转到error.jsp
方式二:实现HandlerExceptionResolver接口
-
创建HandlerExceptionResolver的实现类
@Component public class MyException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg",e.getMessage()); modelAndView.setViewName("error/error"); return modelAndView; } }
-
创建ErrorController类
@Controller @RequestMapping public class ErrorController { @GetMapping("error") public String error(){ int i=1/0;//制造异常 return "success"; } }
-
在url发起请求localhost:8080/error,则会跳转到error.jsp
方式三:使用@ExceptionHandler注解实现异常处理
-
创建枚举类
/* 1.定义一个枚举类, 2.定义一个自定义异常类 3.异常类实体 4.配置全局唯一的异常类 */ public enum StatusEnum { ERROR(3001,"用户不存在"); private Integer status; private String msg; StatusEnum(Integer status, String msg) { this.status = status; this.msg = msg; } public Integer getStatus() { return status; } public String getMsg() { return msg; } }
-
创建自定义异常类
package com.liu.exception; import com.liu.enums.StatusEnum; /** * @author: LYJ * @className: MyException1 * @description: * @date :2023/9/24 16:37 * @version: 0.1 * @since: jdk11 */ public class MyException1 extends RuntimeException{ private StatusEnum statusEnum; public MyException1(StatusEnum statusEnum) { this.statusEnum = statusEnum; } public StatusEnum getStatusEnum() { return statusEnum; } }
-
创建异常实体类
package com.liu.pojo; /** * @author: LYJ * @className: ExceptionResult * @description: * @date :2023/9/24 16:38 * @version: 0.1 * @since: jdk11 */ public class ExceptionResult { private Integer status; private String msg; public ExceptionResult(Integer status, String msg) { this.status = status; this.msg = msg; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
-
创建异常处理类统一处理异常
@ControllerAdvice//添加该注解表示:该类是异常处理类 @ResponseBody //返回json数据 public class MyExceptionHandler { @ExceptionHandler(MyException1.class) public ExceptionResult handler(MyException1 myException1){ StatusEnum statusEnum = myException1.getStatusEnum(); ExceptionResult exceptionResult = new ExceptionResult(statusEnum.getStatus(), statusEnum.getMsg()); return exceptionResult; } }
-
创建一个controller类抛出异常
@Controller @RequestMapping public class ErrorController { @GetMapping("getError") public String error1(){ throw new MyException1(StatusEnum.ERROR); } }
-
发起请求:localhost:8080/getError,验证: