首页 > 其他分享 >Spring MVC 全局的异常处理

Spring MVC 全局的异常处理

时间:2023-06-04 16:33:59浏览次数:40  
标签:return color Spring 处理 MVC ex url 全局 异常



Spring异常处理配置 [url]http://panyongzheng.iteye.com/blog/2208146[/url]
spring基于注解的全局异常处理方式 [url]http://panyongzheng.iteye.com/blog/2067110[/url]
使用Spring MVC统一异常处理实战 [url]http://panyongzheng.iteye.com/blog/2213655[/url]
[color=red]怎么在Spring Controller里面返回404[/color] [url]http://jaskey.github.io/blog/2014/09/27/how-to-return-404-in-spring-controller/[/url]



[color=red][b]1、使用SimpleMappingExceptionResolver实现异常处理 [/b][/color]

  在Spring的配置文件applicationContext.xml中增加以下内容:

<!-- 系统错误转发配置[并记录错误日志]   -->  
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
<property name="defaultErrorView" value="error"></property>   <!-- 默认为500,系统错误(error.jsp)  -->  
<property name="defaultStatusCode" value="500"></property>  
<property name="statusCodes"><!-- 配置多个statusCode -->  
  <props>      
      <prop key="error">500</prop>  <!-- error.jsp -->  
      <prop key="error1">404</prop>    <!-- error1.jsp -->  
  </props>      
</property>      
<property name="exceptionMappings">  
    <props>  
        <!-- 这里你可以根据需要定义N多个错误异常转发 -->  
        <prop key="java.sql.SQLException">dbError</prop> <!-- 数据库错误(dbError.jsp) -->  
        <prop key="org.springframework.web.bind.ServletRequestBindingException">bizError</prop> <!-- 参数绑定错误(如:必须参数没传递)(bizError.jsp) -->  
        <prop key="java.lang.IllegalArgumentException">bizError</prop>  <!-- 参数错误(bizError.jsp) -->  
        <prop key="org.springframework.validation.BindException">bizError</prop>  <!-- 参数类型有误(bizError.jsp) -->  
        <prop key="java.lang.Exception">unknowError</prop>  <!-- 其他错误为'未定义错误'(unknowError.jsp)  -->  
    </props>  
</property>  
</bean>


注:使用SimpleMappingExceptionResolver进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,但该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。



[color=red][b]2、 实现HandlerExceptionResolver 接口自定义异常处理器[/b][/color]



  增加HandlerExceptionResolver 接口的实现类MyExceptionHandler,代码如下:


public class MyExceptionHandler implements HandlerExceptionResolver {  

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  
        Map<String, Object> model = new HashMap<String, Object>();  
        model.put("ex", ex);  

        // 根据不同错误转向不同页面  
        if(ex instanceof BusinessException) {  
            return new ModelAndView("error-business", model);  
        }else if(ex instanceof ParameterException) {  
            return new ModelAndView("error-parameter", model);  
        } else {  
            return new ModelAndView("error", model);  
        }  
    }  
}


在Spring的配置文件applicationContext.xml中增加以下内容:


<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>


注:使用实现HandlerExceptionResolver接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。



[color=red][b]3 、使用@ExceptionHandler注解实现异常处理 [/b][/color]



  增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理,代码如下:


public class BaseController {  
    /** 基于@ExceptionHandler异常处理 */  
    @ExceptionHandler({ RuntimeException.class })
    public String exp(HttpServletRequest request, Exception ex) {  

        request.setAttribute("ex", ex);  

        // 根据不同错误转向不同页面  
        if(ex instanceof BusinessException) {  
            return "error-business";  
        }else if(ex instanceof ParameterException) {  
            return "error-parameter";  
        } else {  
            return "error";  
        }  
    }  
}


以下代码来判断是否是ajax方式, [color=blue]一个权限的异常处理[/color]


@ExceptionHandler({UnauthorizedException.class})
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ModelAndView exception(final UnauthorizedException e, final HttpServletRequest request, Writer writer) {
        logger.error("全句异常 UnauthorizedException 处理......");
        String message = "你没有访问这个页面,表格或者接口等权限";
        e.printStackTrace();
        if (!"XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
            ModelAndView view=new ModelAndView("/auth");
            view.addObject("message", message);
            return view;
        } else {
            try{
                ControllerContext context= ControllerContext.getNewControllerContext();
                context.addMessage(message);
                context.setError();
                writer.write(JSONUtil.toJSONString(context));
                writer.flush();
                writer.close();
            }catch (Exception e1){
                e1.printStackTrace();
            }finally {
                return null;
            }
        }
    }



修改代码,使所有需要异常处理的Controller都继承该类,



注:使用@ExceptionHandler注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的Controller类继承于BaseController即可)、不需要附加Spring配置等优点,但该方法对已有代码存在入侵性(需要修改已有代码,使相关类继承于BaseController),在异常处理时不能获取除异常以外的数据。



[color=red][b]4、未捕获异常的处理


[/b][/color]


  修改web.xml文件,增加以下内容:


<!-- 出错页面定义 -->  
<error-page>  
    <exception-type>java.lang.Throwable</exception-type>  
    <location>/500.jsp</location>  
</error-page>  
<error-page>  
    <error-code>500</error-code>  
    <location>/500.jsp</location>  
</error-page>  
<error-page>  
    <error-code>404</error-code>  
    <location>/404.jsp</location>  
</error-page>  

<!-- 这里可继续增加服务器错误号的处理及对应显示的页面 -->

标签:return,color,Spring,处理,MVC,ex,url,全局,异常
From: https://blog.51cto.com/u_3871599/6410960

相关文章

  • Spring MVC文件上传 文件上传解析 Spring MVC文件上传详解
    首先我要说的是springmvc的核心控制器DispachServlet,这个控制器主要是用来起调度作用,他里面默认就带了一个文件上传的视图解析器,叫multipartResolver,而这个视图解析器SpringMVC又提供了一个默认的实现,叫CommonMultipartResolver,说白了这个实现底层用的就是common-fileupload,......
  • Supporting Spring-WS and Spring MVC integration in a project
    [url]http://www.java-allandsundry.com/2011/06/supporting-spring-ws-and-spring-mvc.html[/url]SpringWSandSpringMVCprovidedifferentfrontcontrollerimplementationsasagatewaytothewebserviceandtheMVCfunctionalityrespectiv......
  • Spring CXF实例
    [b][color=red]参考:[/color][/b]CXFSpring整合——又一个helloword![url]http://pphqq.iteye.com/blog/1447800[/url]一个依赖问题:A:[color=red]如果希望以一种一致的方式实现webservice,特别是有跨语言的需求时,应该使用[b]Axis2[/b][/color]B:[color......
  • Spring和MyBatis整合
    框架整合时三层架构的分工  进行SSM框架整合时,两个框架的分工如下所示。MyBatis负责与数据库进行交互。Spring负责事务管理,Spring可以管理持久层的Mapper对象及业务层的Service对象。由于Mapper对象和Service对象都在Spring容器中,所以可以在业务逻辑层通过Service对象调用......
  • Spring3.2 + cxf1.7.3整合
    参考:[url]http://tsinglongwu.iteye.com/blog/832704[/url][color=red][b]测试调试工具介绍[/b][/color][b]1.SoapUI1.6[/b][url]http://webservices.ctocio.com.cn/tips/263/7817763.shtml[/url][b]2.TestMaker[/b][url]http://webservices.ctocio.com......
  • SpringMVC3.2.x + Hibernate4.2.x + ecache + Spring Security 3.0.5
    这只是部分代码,一些代码可以参考:[url]http://panyongzheng.iteye.com/blog/1871418[/url]SpringSecurity3.1最新配置实例[url它自带的附件也上传。SpringSecurity3十五日研究[url]http://www.blogjava.net/SpartaYew/archive/2013/09/23/350630.html[/......
  • Spring整合mybatis使用xml配置事务
    自己准备开始教授Java相关的技术,Spring框架是必须让学生学习的框架之一。里面有一个事务的配置以前刚学习Spring框架的时候有接触过,不过已经过了很多年,很多东西都已经忘记。现在再来回忆一下如何使用Spring框架类配置事务。使用到的maven坐标如下:<dependencies>    <......
  • 从日志记一次Spring事务完整流程
    spring事务一次完整流程,创建》确认获取连接》完成》提交》释放链接DataSourceTransactionManager//Step1.进入业务方法前,依据事物切面创建事务对象2019-07-0622:34:24,819[main]DEBUGo.s.j.d.DataSourceTransactionManager-Creatingnewtransactionwithname[com......
  • Spring 3.0.5+MyBatis3.0.4整合非完全例子
    基于注解的mybatis和spring整合:[url]http://huangmin001.iteye.com/blog/1185806[/url][color=red]这个文章说的很详细,很值得一看[/color].Maven+SpringMVC+Mybatis【绝非原创,单纯整理】【四】:[url]http://playgod1984.iteye.com/blog/984113[/ur......
  • spring jdbcTemplate使用
    参考:springjdbcTemplate使用[url]http://log-cd.iteye.com/blog/215059[/url]SpringJdbcTemplate与事务管理学习[url]http://www.iteye.com/topic/480432[/url]SimpleJdbcTemplate在spring3.1已经过时了,我就改为使用jdbcTemplate和namedParameterJdbcOperations写sql查询......