spring的异常统一处理非常简单,首先我们需要看一下Spring中定义的HandlerExceptionResolver接口:

/**

* Interface to be implemented by objects than can resolve exceptions thrown

* during handler mapping or execution, in the typical case to error views.

* Implementors are typically registered as beans in the application context.

*

*

Error views are analogous to the error page JSPs, but can be used with

* any kind of exception including any checked exception, with potentially

* fine-granular mappings for specific handlers.

*

* @author Juergen Hoeller

* @since 22.11.2003

*/

public interface HandlerExceptionResolver {

/**

* Try to resolve the given exception that got thrown during on handler execution,

* returning a ModelAndView that represents a specific error page if appropriate.

*

The returned ModelAndView may be {@linkplain ModelAndView#isEmpty() empty}

* to indicate that the exception has been resolved successfully but that no view

* should be rendered, for instance by setting a status code.

* @param request current HTTP request

* @param response current HTTP response

* @param handler the executed handler, or null if none chosen at the

* time of the exception (for example, if multipart resolution failed)

* @param ex the exception that got thrown during handler execution

* @return a corresponding ModelAndView to forward to,

* or null for default processing

*/

ModelAndView resolveException(

HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

}

他定义了一个resolveException方法,我们如果要处理异常的话,需要实现这个接口类,并且实现resolveException方法,在resolveException方法中处理自己的异常逻辑。 例如我设计一个自定义的异常处理类:

/**

* 自定义一个异常捕获处理类

* @author zhuli

* @date 2014-9-3

*/

public class MyExceptionResolver implements HandlerExceptionResolver {

private static final Logger logger = LoggerFactory.getLogger(MyExceptionResolver.class);

@Override

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

//可以自由处理各种异常逻辑

if (ex instanceof org.springframework.web.HttpRequestMethodNotSupportedException) {

logger.warn(Logger.ACTION.DEFAULT, "Http Method Error");

}

return null;

}

}

然后需要将我们的我们自定义的MyExceptionResolver类注入到bean中

具体Spring是怎么调用的?我们可以先看下Spring中的doDispatch方法中,有这么一段代码:

catch (ModelAndViewDefiningException ex) {

logger.debug("ModelAndViewDefiningException encountered", ex);

mv = ex.getModelAndView();

}

catch (Exception ex) {

Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);

mv = processHandlerException(processedRequest, response, handler, ex);

errorView = (mv != null);

}

其中processHandlerException方法就是来捕获异常处理的,那么继续看processHandlerException这个方法:

protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,

Object handler, Exception ex) throws Exception {

// Check registered HandlerExceptionResolvers...

ModelAndView exMv = null;

for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {

exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);

if (exMv != null) {

break;

}

}

if (exMv != null) {

if (exMv.isEmpty()) {

return null;

}

// We might still need view name translation for a plain error model...

if (!exMv.hasView()) {

exMv.setViewName(getDefaultViewName(request));

}

if (logger.isDebugEnabled()) {

logger.debug("Handler execution resulted in exception - forwarding to resolved error view: " + exMv, ex);

}

WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());

return exMv;

}

throw ex;

}

这个方法中的handlerExceptionResolver.resolveException就是用来捕获异常的,并且Spring允许多个自定义的异常类实现。 可以看this.handlerExceptionResolvers方法,跟踪进去

private void initHandlerExceptionResolvers(ApplicationContext context) {

this.handlerExceptionResolvers = null;

if (this.detectAllHandlerExceptionResolvers) {

// Find all HandlerExceptionResolvers in the ApplicationContext, including ancestor contexts.

Map matchingBeans = BeanFactoryUtils

.beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true, false);

if (!matchingBeans.isEmpty()) {

this.handlerExceptionResolvers = new ArrayList(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.

}

}

// Ensure we have at least some HandlerExceptionResolvers, by registering

// default HandlerExceptionResolvers if no other resolvers are found.

if (this.handlerExceptionResolvers == null) {

this.handlerExceptionResolvers = getDefaultStrategies(context, HandlerExceptionResolver.class);

if (logger.isDebugEnabled()) {

logger.debug("No HandlerExceptionResolvers found in servlet '" + getServletName() + "': using default");

}

}

}

可以清洗看到这个方法是将handlerExceptionResolvers进行了初始化,并将自定义的异常处理类(可以多个)写入this.handlerExceptionResolvers

java spring异常处理_Java深入 - Spring 异常处理HandlerExceptionResolver相关推荐

  1. java 多层异常_Java多层嵌套异常处理的基本流程

    异常是程序中的一些错误,但并不是所有的错误都是异常,错误有时候是可以避免的.异常的对象有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的 ...

  2. java aop模式_Java的Spring框架下的AOP编程模式示例

    Spring框架的关键组件是面向方面编程(AOP)框架.面向方面的编程不仅打破程序逻辑分成不同的部分称为所谓的担忧.跨越多个点的应用程序的功能被称为横切关注点和这些横切关注点是从应用程序的业务逻辑概念 ...

  3. java 错误 代码_Java错误代码及异常处理

    现在有个项目,遇到错误代码和异常处理方面的问题,请教各位高手. 背景:项目对外提供服务,这些服务是对很多外部系统提供服务的封装,每个外部系统有自己的错误代码,没有统一的规范.有些外部系统自己规范都不统 ...

  4. java map 数组_java技术Spring集合属性

    集合属性 在Spring中可以通过一组内置的XML标签来配置集合属性,例如:<list>,<set>或<map>. 1 数组和List 配置java.util.Li ...

  5. java 异常恢复_Java学习之异常处理

    异常恢复是提高鲁棒性最重要的方法. 前言:这篇文章是我自己的笔记,基本上是我翻译的<Thinking in Java>第12章,翻译不是目的,目的是想写一遍印象深刻,因为有些句子翻译不好, ...

  6. java 云架构_java版Spring Cloud云架构代码结构构建

    本篇我们根据架构图进行代码的构建.根据微服务化设计思想,结合spring cloud一些优秀的项目,如服务发现.治理.配置化管理.路由负载.安全控制等优秀解决方案,使用Maven技术将框架进行模块化. ...

  7. java socket 异常处理_Java Socket常见异常处理 和 网络编程需要注意的问题

    在java网络编程Socket通信中,通常会遇到以下异常情况: 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发 ...

  8. java rmi配置_Java、Spring配置RMI连接

    1.新建J2EE项目A.B,在A.B项目中建立com.A.xfire包 2.项目A.B中导入spring-2.5.6.jar 3.在A.B项目中使用建立接口类com.A.xfire.XfireFaca ...

  9. Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver

    Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver Spring MVC异常处理对于确保您不 ...

最新文章

  1. ubuntu VMware
  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )
  3. 修改远程桌面端口号3389
  4. 反思供应链项目:实践出真知 多反思提升效率的方法
  5. tcp3次握手,https加密,ca认证
  6. 设计模式 - Composite
  7. angularjs 表单验证 和 页面初始化闪烁
  8. python科学计算包与matlab_做科学计算用Python还是MATLAB?
  9. 学习就是一件要耐的住寂寞放的下欲望舍的得享乐的事
  10. VScode 搭建 django 开发环境(MAC、Python3.7)
  11. 支付宝小程序获取用户手机号php,小程序登录、获取用户信息、手机号
  12. 金刚石切割丝的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. NYOJ34韩信点兵
  14. 符号常量和常变量的区别
  15. java web 邮件_Javaweb_邮件发送
  16. 【Sublime Text 3】Sublime Text 3 - cracked 3086
  17. 【1000套HTML5+CSS项目实战案例】大学生期末网页作业源代码
  18. idea和maven设置代理
  19. 2023北方民族大学计算机考研信息汇总
  20. oVirt Windows Guest Tools

热门文章

  1. java 圆的交点_java求两个圆相交坐标
  2. TextVQA论文汇总
  3. BZOJ 2759 一个动态树好题 (LCT)
  4. pip更换源 windows10_Conda及Pip换源处理
  5. 已阻止网站自动通话怎么回事_如何实现百度快速收录网站与快速排名
  6. Docker镜像加速,设置国内源
  7. 和Leo一起做爱字符串的好孩子量子纠缠
  8. 粘包问题,以及在python中如何调用操作系统命令
  9. iOS xocde编译报错 NSObjCRuntime.h
  10. MySQL --log-slave-updates