服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

2021-12-28 13:17宁与颂 Java教程

这篇文章主要介绍了SpringMVC 异常处理SimpleMappingExceptionResolver类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

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

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

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

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

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

一、基于 HandlerExceptionResolver 接口的方式

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 配置文件进行声明即可。自定义实现类与默认的实现类,可同时使用。

示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 自定义的实现类 --><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>

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

?
1
2
3
4
5
6
7
8
9
<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 中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。

?
1
2
3
4
5
6
7
8
9
10
@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 同样是配置出现错误时显示的页面:

?
1
2
3
4
<error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
</error-page>

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

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

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

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

原文链接:https://www.cnblogs.com/libra0920/p/6289848.html

延伸 · 阅读

精彩推荐
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08