SSM系列——SpringMVC异常处理
异常处理
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
在SpringMVC中异常会由前端控制器交给异常处理器(HandlerExceptionResolver)进行处理
异常处理的两种方式
- SimpleMappingExceptionResolver:内置提供的异常处理器,无需自己书写,需要配置即可
- 实现HandlerExceptionResolver:自定义异常处理器
SimpleMappingExceptionResolver
1.编写controller并制造一个异常
package com.example.mvc1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class ErrorController {
@GetMapping("/error1")
public ModelAndView error(ModelAndView modelAndView){
//设置一个异常
String str = "56sjdk";
Integer num = Integer.valueOf(str);
modelAndView.setViewName("success");
return modelAndView;
}
}
2.配置简单异常处理器
在spring-mvc.xml中
<!-- 简单通用异常配置-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="comerror"></property>
</bean>
3.设定一个和value中一样名字的页面
<property name="defaultErrorView" value="comerror"></property>
如这里value是comerror,那么就设定一个交comerror的jsp
<%--
Created by IntelliJ IDEA.
User: Syf200208161018
Date: 2022/5/1
Time: 23:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>this is a common error</h1>
</body>
</html>
针对已知异常进行简单处理
仅需要改写spring-mvc.xml中的即可,因为我们知道是数字格式化异常我们就可以仅针对这个异常进行处理,当然你还要自己定一个jsp进行展示
<!-- 简单通用异常配置-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- <property name="defaultErrorView" value="comerror"></property>-->
<property name="exceptionMappings">
<map>
<entry key="java.lang.NumberFormatException" value="errorClass"></entry>
</map>
</property>
</bean>
自定义的异常处理器
1.创建异常处理器类实现HandlerExceptionResolver接口
package com.example.mvc1.resolver;
import com.example.mvc1.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ErrorResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
if(ex instanceof MyException){
modelAndView.setViewName("errorClass");
}
return modelAndView;
}
}
2.配置异常处理器
<!-- 配置自定义异常处理器-->
<bean class="com.example.mvc1.resolver.ErrorResolver"></bean>
3.编写controller
抛出的myException实际上根本没有实际性的东西
package com.example.mvc1.controller;
import com.example.mvc1.exception.MyException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class ErrorController {
@GetMapping("/error1")
public ModelAndView error(ModelAndView modelAndView) throws MyException {
this.fakeError();
modelAndView.setViewName("success");
return modelAndView;
}
public void fakeError() throws MyException {
//设置一个异常
throw new MyException();
}
}