首页 > 其他分享 >十一(一)、springMVC之异常处理@ExceptionHandler注解

十一(一)、springMVC之异常处理@ExceptionHandler注解

时间:2022-10-13 18:34:17浏览次数:43  
标签:web springMVC ModelAndView ExceptionHandler springframework ex org 注解

一、概述:

springMVC通过HandlerExceptionResolver处理程序的异常,异常包括 Handler映射、数据绑定以及目标方法执行时发生的异常;

springMVC提供的HandlerExceptionResolver的实现类有:

  1. ExceptionHandler:处理异常,可以把异常写到页面上;
  2. DefaultHandlerExceptionResplver 处理指定异常;
  3. ResponseStatusExceptionResource 更改自定义异常的状态码和异常原因
  4. ​simpleMappingExceptionResolver​​ 指定异常跳转页面

 

ExceptionHandler:

@ExceptionHandler注解:

1.在@ExceptionHandler 方法的入参中可以加入Exception 类型的参数,该参数即对应发生的异常的对象

2.在@ExceptionHandler 方法的入参不能传入 map;若希望吧异常信息传到页面上,需要使用ModelAndView做返回值

3.@ExceptionHandler 存在优先级为,从小到大;越匹配优先级越高;

4.@ControllerAdvice:如果当前Handler中找不到@ExceptionHandler,则去@ControllerAdvice标记的类中查找@ExceptionHandler标记的方法来处理异常

1.目录结构为:

十一(一)、springMVC之异常处理@ExceptionHandler注解_xml

2.配置:

web.xml配置:只配置了DispatcherServlet

1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
5 id="WebApp_ID" version="3.1">
6 <servlet>
7 <servlet-name>springDispatcherServlet</servlet-name>
8 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
9 <!-- 配置DispatcherServletd 一个初始化参数:配置springmvc配置文件的位置和名称 -->
10 <!-- 实际上也可以不通过 contextConfigLocation 来配置Springmvc的配置文件,而是用默认的 即默认的配置文件为
11 /WEB-INF/<servlet-name>-servlet.xml 本项目默认位置配置文件即为: /WEB-INF/springDispatcherServlet-servlet.xml -->
12 <init-param>
13 <param-name>contextConfigLocation</param-name>
14 <param-value>classpath:spring.xml</param-value>
15 </init-param>
16 <!-- 表示springDispatcherServlet在加载的时候被创建 -->
17 <load-on-startup>1</load-on-startup>
18 </servlet>
19
20 <!-- Map all requests to the DispatcherServlet for handling -->
21 <servlet-mapping>
22 <servlet-name>springDispatcherServlet</servlet-name>
23 <url-pattern>/</url-pattern>
24 </servlet-mapping>
25 </web-app>

View Code

 spring.xmp配置:基础配置

基础配置包括:包扫描的配置、视图解析器配置、<mvc:annotation-driven></mvc:annotation-driven>;

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:mvc="http://www.springframework.org/schema/mvc"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <context:component-scan base-package="handler"></context:component-scan>
11 <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
12 <bean
13 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
14 <property name="prefix" value="/WEB-INF/views/"></property>
15 <property name="suffix" value=".jsp"></property>
16 </bean>
17
18 <mvc:annotation-driven></mvc:annotation-driven>
19
20 </beans>

View Code

3.EceptionController.java

  • 方法的入参中可以加入Exception 类型的参数,该参数即对应发生的异常的对象
  • 异常信息传到页面上,需要使用ModelAndView做返回值
1 package handler;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.ExceptionHandler;
5 import org.springframework.web.bind.annotation.RequestMapping;
6 import org.springframework.web.bind.annotation.RequestParam;
7 import org.springframework.web.servlet.ModelAndView;
8
9 @RequestMapping("/emp")
10 @Controller
11 public class EceptionController {
12
13 @RequestMapping("/testError")
14 public String testError(@RequestParam("i") int i) {
15 System.out.println(10 / i);
16 return "success";
17 }
18
19 @ExceptionHandler({ ArithmeticException.class })
20 public ModelAndView handleArithmeticException(Exception ex) {
21 System.out.println("出异常了:" + ex);
22 ModelAndView md = new ModelAndView("error");
23 md.addObject("ex", ex);
24 return md;
25 }
26

4.success.jsp&&error.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html>
4 <html>
5 <head>
6 <meta charset="UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 success
11 </body>
12 </html>

View Code

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html>
4 <html>
5 <head>
6 <meta charset="UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 <h4>Error Page</h4>
11 ${ex}
12 </body>
13 </html>

View Code

5.运行结果:

当访问:http://localhost:8080/DataOperate/emp/testError?i=10时,页面跳转到success页面;当访问http://localhost:8080/DataOperate/emp/testError?i=0时,访问了error页面,且error页面打印了异常信息;

十一(一)、springMVC之异常处理@ExceptionHandler注解_mvc_02

 

6.如果异常不匹配:

也就是说@ExceptionHandler标记的异常和实际抛出的异常不匹配,如下,比如EceptionController.java中异常时算术异常,但是@ExceptionHandler标记的只有运行时异常:那么异常存在优先级为,从小到大;越匹配优先级越高;

1 package handler;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.ExceptionHandler;
5 import org.springframework.web.bind.annotation.RequestMapping;
6 import org.springframework.web.bind.annotation.RequestParam;
7 import org.springframework.web.servlet.ModelAndView;
8
9 @RequestMapping("/emp")
10 @Controller
11 public class EceptionController {
12
13 @RequestMapping("/testError")
14 public String testError(@RequestParam("i") int i) {
15 System.out.println(10 / i);
16 return "success";
17 }
18
19 @ExceptionHandler({ RuntimeException.class })
20 public ModelAndView handleRuntimeException(Exception ex) {
21 System.out.println("【出异常了]:" + ex);
22 ModelAndView md = new ModelAndView("error");
23 md.addObject("ex", ex);
24 return md;
25 }
26

此时,访问;http://localhost:8080/DataOperate/emp/testError?i=0,也会跳转到error页面且显示异常信息同上图,且控制台打印:

【出异常了]:java.lang.ArithmeticException: / by zero

 

7.如果当前Handler中找不到@ExceptionHandler

@ControllerAdvice:如果当前Handler中找不到@ExceptionHandler,则去@ControllerAdvice标记的类中查找@ExceptionHandler标记的方法来处理异常

EceptionController.java

1 package handler;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.web.bind.annotation.RequestParam;
6
7 @RequestMapping("/emp")
8 @Controller
9 public class EceptionController {
10
11 @RequestMapping("/testError")
12 public String testError(@RequestParam("i") int i) {
13 System.out.println(10 / i);
14 return "success";
15 }
16

ExceptionHandlerProcess.java

1 package handler;
2
3 import org.springframework.web.bind.annotation.ControllerAdvice;
4 import org.springframework.web.bind.annotation.ExceptionHandler;
5 import org.springframework.web.servlet.ModelAndView;
6
7 @ControllerAdvice
8 public class ExceptionHandlerProcess {
9
10 @ExceptionHandler({ ArithmeticException.class })
11 public ModelAndView handleArithmeticException(Exception ex) {
12 System.out.println("出异常了:" + ex);
13 ModelAndView md = new ModelAndView("error");
14 md.addObject("ex", ex);
15 return md;
16 }
17
18 @ExceptionHandler({ RuntimeException.class })
19 public ModelAndView handleRuntimeException(Exception ex) {
20 System.out.println("【出异常了]:" + ex);
21 ModelAndView md = new ModelAndView("error");
22 md.addObject("ex", ex);
23 return md;
24 }
25
26

运行结果:

此时,访问;http://localhost:8080/DataOperate/emp/testError?i=0,也会跳转到error页面且显示异常信息同上图,且控制台打印相关信息:

: / by zero

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。



标签:web,springMVC,ModelAndView,ExceptionHandler,springframework,ex,org,注解
From: https://blog.51cto.com/u_10632206/5754523

相关文章

  • SpringMvc第一天学习 restful 风格即其中的一些配置及其注解
    在先知道springMVC之前我们先了解一下MVC模式MVC模式是表现层的一种设计模式M代表着模型(model)V代表着视图(View)C代表着控制器(controller)使用MVC的目的是将M和V......
  • 注解_JDK内置注解与注解_自定义注解_格式&本质
    注解_JDK内置注解JDK中预定义的一些注解基本内置注解@Override:检测被该注解标注的方法是否继承自父类(接口)的@Deprecated:该注解标注内容,表示已过时......
  • 反射_Class对象功能_获取Constructor与注解_概念
    反射_Class对象功能_获取Constructor案例:需求:写一个“框架”,不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法实现:......
  • springboot使用自定义注解实现加解密及脱敏
    原文链接: https://www.yisu.com/zixun/622633.html这篇文章主要介绍springboot中如何使用自定义注解实现加解密及脱敏方式,文中介绍的非常详细,具有一定的参考价值,感兴趣......
  • Java反射解析注解
     packagecom.jeeplus.config;importjavax.validation.constraints.Size;importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;importjava.......
  • SpringMVC简介
    SpringMVC简介大部分Java应用都是Web应用,展现层是WEB应用不可忽略的重要环节.Spring为了展现层提供了一个优秀的WEB框架-SpringMVC . 和众多的其他WEB框架一样,它基于......
  • Springmvc简介
    ​SpringMVC简介大部分Java应用都是Web应用,展现层是WEB应用不可忽略的重要环节.Spring为了展现层提供了一个优秀的WEB框架-SpringMVC . 和众多的其他WEB框架一样,......
  • 事务注解:@Transtation
    事务注解:@Transtation@Transactional注解可以作用于接口、接口方法、类以及类方法上当作用于类上时,该类的所有public方法将都具有该类型的事务属性当作用在方法......
  • SpringBoot 自定义注解 实现多数据源
    SpringBoot自定义注解实现多数据源前置学习需要了解注解、Aop、SpringBoot整合Mybatis的使用。数据准备基础项目代码:https://gitee.com/J_look/spring-boot-all-dem......
  • java常用注解校验参数
    validation中内置的constraints注解描述@AssertFalse 所注解的元素必须是Boolean类型,且值为false@AssertTrue所注解的元素必须是Boolean类型,且值为true......