Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

 更新时间:2021年09月11日 10:32:50   作者:宁与颂  
这篇文章主要介绍了SpringMVC 异常处理SimpleMappingExceptionResolver类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

Spring3.0 对异常的处理方式总共有两种:

一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExceptionResolver。

第二种方法是在 Controller 内部实现,灵活性更高。

从目前的调查结果来看,这两种方式不能共存。我们一般在项目中使用第一种方法。

下面分别描述一下这两种使用方式:

一、基于 HandlerExceptionResolver 接口的方式

使用这种方式只需要实现 resolveException 方法,该方法返回一个 ModelAndView 对象,在方法内部对异常的类型进行判断,然后返回合适的 ModelAndView 对象,如果该方法返回了 null,则 Spring 会继续寻找其他的实现了 HandlerExceptionResolver 接口的 Bean。换句话说,Spring 会搜索所有注册在其环境中的实现了 HandlerExceptionResolver 接口的 Bean,逐个执行,直到返回了一个 ModelAndView 对象。

public class CustomExceptionHandler implements HandlerExceptionResolver {  
  
    @Override  
    public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object object, Exception exception) {  
        if(exception instanceof IOException){  
            return new ModelAndView("ioexp");  
        }else if(exception instanceof SQLException){  
            return new ModelAndView("sqlexp");  
        }  
        return null;  
    }  
}

这个类必须声明到 Spring 配置文件中,或者使用 @Component 标签,让 Spring 管理它。同时 Spring 也提供默认的实现类 SimpleMappingExceptionResolver,需要使用时只需要使用注入到 Spring 配置文件进行声明即可。自定义实现类与默认的实现类,可同时使用。

示例如下:

<!-- 自定义的实现类 --><bean id="exceptionHandler" class="com.enh.test.CustomExceptionHandler"/><!-- 默认的实现类注入 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
    <!-- 为所有的异常定义默认的异常处理页面,exceptionMappings未定义的异常使用本默认配置 -->  
    <property name="defaultErrorView" value="error"></property>  
    <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->  
    <property name="exceptionAttribute" value="ex"></property>  
    <!--     定义需要特殊处理的异常,用类名或完全路径名作为key,异常页文件名作为值,    将不同的异常映射到不同的页面上。   -->  
    <property name="exceptionMappings">  
        <props>  
            <prop key="IOException">error/ioexp</prop>  
            <prop key="java.sql.SQLException">error/sqlexp</prop>  
        </props>  
    </property>  
</bean>

一个典型的异常显示界面如下:

<html> 
<head><title>Exception!</title></head> 
<body> 
  <% Exception ex = (Exception)request.getAttribute("exception"); %> 
  <H2>Exception: <%= ex.getMessage();%></H2> 
  <P/> 
  <% ex.printStackTrace(new java.io.PrintWriter(out)); %> 
</body> 
</html>

exception 是在 SimpleMappingExceptionResolver 被存放到 request 中的,具体可以查看源代码。

另外这里配置的异常显示界面均仅包括主文件名,至于文件路径和后缀已经在 viewResolver 中指定。如果找不到页面,会根据错误提示再调整页面路径。

二、Controller 内部单独实现

该方法需要定义在 Controller 内部,然后创建一个方法并用 @ExceptionHandler 注解来修饰用来处理异常,这个方法基本和 @RequestMapping 修饰的方法差不多,只是可以多一个类型为 Exception 的参数,@ExceptionHandler 中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。

@Controller  
public class ExceptionHandlerController {  
      
    @ExceptionHandler(value={IOException.class,SQLException.class})  
    public String exp(Exception ex,HttpServletRequest request) {  
        request.setAttribute("ex", ex);  
        return "/error.jsp";  
    }  
  
}

三、相关问题

HandlerExceptionResolver 和 web.xml 中配置的 error-page 会有冲突吗?

web.xml 中配置 error-page 同样是配置出现错误时显示的页面:

<error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
</error-page>

如果 resolveException 返回了 ModelAndView,会优先根据返回值中的页面来显示。不过,resolveException 可以返回 null,此时则展示 web.xml 中的 error-page 的500状态码配置的页面。

API 文档中对返回值的解释:

return a corresponding ModelAndView to forward to, or null for default processing.

到此这篇关于SpringMVC 异常处理SimpleMappingExceptionResolver类详解的文章就介绍到这了,更多相关SpringMVC 异常处理SimpleMappingExceptionResolver类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用CompletableFuture实现异步编程

    Java使用CompletableFuture实现异步编程

    在现代 Java 开发中,异步编程是一项重要技能,而 CompletableFuture 是从 Java 8 开始提供的一个功能强大的工具,用于简化异步任务的编写和组合,本文将详细介绍 CompletableFuture 的基本使用和一些常见的应用场景,需要的朋友可以参考下
    2025-01-01
  • springboot对压缩请求的处理方法

    springboot对压缩请求的处理方法

    这篇文章主要介绍了springboot对压缩请求的处理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Spring JPA之find拓展方法示例详解

    Spring JPA之find拓展方法示例详解

    这篇文章主要为大家介绍了Spring JPA之find拓展方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java ThreadPoolExecutor 线程池的使用介绍

    Java ThreadPoolExecutor 线程池的使用介绍

    Executors 是一个Java中的工具类. 提供工厂方法来创建不同类型的线程池,这篇文章主要介绍了Java ThreadPoolExecutor 线程池的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java代码规范之不合理命名与重复代码示例详解

    java代码规范之不合理命名与重复代码示例详解

    这篇文章主要为大家介绍了java代码规范之不合理命名与重复代码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java结合email实现自动推送功能

    java结合email实现自动推送功能

    这篇文章主要介绍了java结合email实现自动推送功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • JeecgBoot框架升级至Spring Boot3的实战步骤

    JeecgBoot框架升级至Spring Boot3的实战步骤

    本文主要介绍了JeecgBoot框架升级至Spring Boot3的实战步骤,从 2.7.10升级到3.1.5有以下几个点需要注意,下面就来详细的介绍一下,感兴趣的可以了解一下
    2024-04-04
  • Java实现布隆过滤器的几种方式总结

    Java实现布隆过滤器的几种方式总结

    这篇文章给大家总结了几种Java实现布隆过滤器的方式,手动硬编码实现,引入Guava实现,引入hutool实现,通过redis实现等几种方式,文中有详细的代码和图解,需要的朋友可以参考下
    2023-07-07
  • spring使用WebSocket注入service层失败问题及解决

    spring使用WebSocket注入service层失败问题及解决

    这篇文章主要介绍了spring使用WebSocket注入service层失败问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 浅谈Spring的两种事务定义方式

    浅谈Spring的两种事务定义方式

    下面小编就为大家带来一篇浅谈Spring的两种事务定义方式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论