文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

2024-04-02 19:55

关注

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类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯