gpt4 book ai didi

基于SpringMVC的全局异常处理器介绍

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章基于SpringMVC的全局异常处理器介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

近几天又温习了一下SpringMVC的运行机制以及原理 。

我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller、@RequestMapping、@Autowared、@Component,今天呢,我所要写的是SpringMVC的全局异常处理器,关联的接口有HandlerExceptionResolver(Eclipse用户可以按Ctrl+Shift+T进行搜索该接口),什么是全局异常处理器?为什么要用它呢?

在企业开发中,各种的Runtime异常可能会让我们崩溃,但是还有一部分异常在此之外,因此我们就要捕获它,然后进行操作提示(将错误提示返回到ModelAndView) 。

下来呢,我贴一部分代码 。

首先呢,创建一个自定义的异常类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
  * @Title: ExceptionCustom.java
  * @Description: 本地异常
  * @author ChoviWu
  * @version V1.0
  */
public class ExceptionCustom extends Exception{
 
  /**
  * @Fields serialVersionUID :
  */
  private static final long serialVersionUID = 1L;
  private String message;
 
  /**
   * @return the message
   */
  public String getMessage() {
   return message;
  }
 
  /**
   * @param message the message to set
   */
  public void setMessage(String message) {
   this .message = message;
  }
 
  public ExceptionCustom() {
   super ();
   // TODO Auto-generated constructor stub
  }
 
  public ExceptionCustom(String message) {
   super (message);
   this .message = message;
  }
}

创建一个全局异常处理器的类,让它实现HandlerExceptionResolver 接口。相信,基础好一点的同学可以看出来我代码的意思(注释) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.log4j.Logger;
org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
 
/**
  * @Title: SimpleException.java
  * @Description:全局异常处理器
  * @author ChoviWu
  * @version V1.0
  */
public class SimpleExceptionResolver implements HandlerExceptionResolver {
 
  // 异常对象
  ExceptionCustom exceptionCustom = null ;
 
  private Logger logger = Logger.getLogger(SimpleExceptionResolver. class
    .getSimpleName());
 
  /**
   * 全局处理异常
   */
  public ModelAndView resolveException(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex) {
   //转化为自定义异常
   exceptionCustom = (ExceptionCustom) ex;
   //判断是否是本地异常
   if (ex instanceof ExceptionCustom) {
    logger.info(ex.getMessage());
   } else {
    …抛出错误
   }
   //获取异常信息
   String message = exceptionCustom.getMessage();
   ModelAndView mv = new ModelAndView();
   //将异常返回到Model
   mv.addObject( "xx" , message);
   // 指向错误页面
   mv.setViewName( "error" );
   return null ;
  }
 
}

解释一下,在判断一个异常是否是其他异常的时候,先看它是否属于本地异常(Exception)的exceptionCustom ,如果是本地异常,则抛出本地异常信息 。

?
1
2
3
4
5
if (ex instanceof ExceptionCustom) {
    logger.info(ex.getMessage());
   } else {
    …抛出错误
   }

  。

如果不是本地异常,则抛出未知异常 。

  。

然后从异常里面获取异常信息,将异常信息返回到MV中,最后转至页面,当然严谨一点的,会将异常信息添加到数据库中,方便查看 。

由于本文章只是一个Demo,所以没有考虑到很多因素 。

下来,说说配置文件 。

配置文件,先贴上代码,然后再做解释 。

?
1
2
<!-- 全局异常处理器 -->
<bean id= "handlerExceptionResolver" class = "xxxx(包名).SimpleExceptionResolver" />

  。

注意:首先,这个bean将配置在自己的web层.xml(spring-web.xml),当启动tomcat,加载web.xml后需加载spring-web.xml 。

之前注入的bean的id我随便写了一个名称,然后spring解析的时候报错了, 。

之后看了源码的时候,才知道原来是这么回事 。

?
1
2
1SpringMVC 在org.springframework.web.servlet.DispatcherServlet类中声明了
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver" ;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void initHandlerExceptionResolvers(ApplicationContext context) {
   this .handlerExceptionResolvers = null ;
 
   if ( this .detectAllHandlerExceptionResolvers) {
    // Find all HandlerExceptionResolvers in the ApplicationContext, including ancestor contexts.
    Map<String, HandlerExceptionResolver> matchingBeans = BeanFactoryUtils
      .beansOfTypeIncludingAncestors(context, HandlerExceptionResolver. class , true , false );
    if (!matchingBeans.isEmpty()) {
     this .handlerExceptionResolvers = new ArrayList<HandlerExceptionResolver>(matchingBeans.values());
     // We keep HandlerExceptionResolvers in sorted order.
     OrderComparator.sort( this .handlerExceptionResolvers);
    }
   }
   else {
    try {
     HandlerExceptionResolver her =
       context.getBean(HANDLER_EXCEPTION_RESOLVER_BEAN_NAME, HandlerExceptionResolver. class );
     this .handlerExceptionResolvers = Collections.singletonList(her);
    }
    catch (NoSuchBeanDefinitionException ex) {
     // Ignore, no HandlerExceptionResolver is fine too.
    }
   }

看完这段代码的同学应该就知道为什么把bean 的id 设置成handlerExceptionResolver了吧 。

?
1
HandlerExceptionResolver her =context.getBean(HANDLER_EXCEPTION_RESOLVER_BEAN_NAME, HandlerExceptionResolver. class );

所以说,全局异常处理器的bean的id不能随便的设置.

以上这篇基于SpringMVC的全局异常处理器介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

最后此篇关于基于SpringMVC的全局异常处理器介绍的文章就讲到这里了,如果你想了解更多关于基于SpringMVC的全局异常处理器介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com