SpringMVC 异常处理

一、异常解析器应该具有的功能:

1、既然使用异常解析器,那么就不必在Controller中对异常进行处理,抛出即可,简化开发,异常统一控制。

2、ajax请求(有@ResponseBody的Controller)发生错误,输出JSON。

3、页面请求(无@ResponseBody的Controller)发生错误,输出错误页面。

4、 它需要与AnnotationMethodHandlerAdapter使用同一个messageConverters

5、异常处理细节可控制。

二、SpringMVC异常机制总体思想:

(1)普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新,从而改善用户体验,基本思路是:把异常转换成json数据返回,这样ajax的回调函数,就能解析出错误原因。(对于仅仅提供json接口发生异常,可以输出异常json信息)

(2)普通界面与json数据出错跳入错误界面,需要重写异常解析器。

(3)单地统一配置异常,使得发生普通错误指定到固定的页面,ajax发生错直接通过js获取,展现给用户。

三、SpringMVC框架中常用的异常处理办法:

(1)

Dao层:直接抛出异常即可

Service层:直接抛出异常即可

Controller层: 访问页面时出现异常即可跳入错误页面

Ajax请求:出现异常时提醒异常,不跳出界面

(2)在项目中Controller中的异常配置:

Web.xml:

<error-page>

<exception-type>java.lang.Throwable</exception-type>

<location>/error.html</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/500.html</location>

</error-page>

<error-page>

<error-code>404</error-code>

<location>/404.html</location>

</error-page>

Spring-servlet.xml:

<!-- 覆盖org.springframework.web.servlet.handler.SimpleMappingExceptionResolver,实现普通请求和ajax请求的异常处理 -->

<bean id="exceptionResolver" class="xyt.first.web.exception.CustomSimpleMappingExceptionResolver">

<!-- 异常信息变量名

配置异常的属性值为ex,那么在错误页面中可以通过 ${ex} 来获取异常的信息

如果不配置这个属性,它的默认值为exception-->

<property name="exceptionAttribute" value="ex"></property>

<!--需要做特殊处理的异常,用类名或者完全路径作为key,异常页面作为值  -->

<property name="exceptionMappings">

<props>

<!-- 表示当抛出NumberFormatException异常时,会跳入commons/number界面 -->

<prop key="NumberFormatException">commons/number</prop>

<prop key="NullPointerException">commons/null</prop>

<prop key="java.lang.ArrayIndexOutOfBoundsException">commons/error</prop>

</props>

</property>

<!-- 定义发生异常时 视图与返回码对应关系 -->

<property name="statusCodes">

<props>

<!-- 表示在发生NumberFormatException时返回视图number,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 -->

<prop key="commons/number">500</prop>

<prop key="commons/null">503</prop>

</props>

</property>

<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->

<property name="warnLogCategory" value="WARN"></property>

<!-- 发生异常时默认返回码404 -->

<property name="defaultStatusCode" value="500"/>

<!-- 表示抛出异常时没有在exceptionMappings找到对应的异常时返回error视图  -->

<property name="defaultErrorView" value="commons/error"/>

</bean>

实现普通异常和ajax异常的处理

观察SimpleMappingExceptionResolver,我们可以复写其doResolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)方法,通过修改该方法实现普通异常和ajax异常的处理,代码如下:

public class CustomSimpleMappingExceptionResolver extends

SimpleMappingExceptionResolver {

@Override

protected ModelAndView doResolveException(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex) {

// Expose ModelAndView for chosen error view.

String viewName = determineViewName(ex, request);

if (viewName != null) {// JSP格式返回

if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request

.getHeader("X-Requested-With")!= null && request

.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {

// 如果不是异步请求

Integer statusCode = determineStatusCode(request, viewName);

if (statusCode != null) {

applyStatusCodeIfPossible(request, response, statusCode);

}

return getModelAndView(viewName, ex, request);

} else {// JSON格式返回

try {

PrintWriter writer = response.getWriter();

writer.write(ex.getMessage());

writer.flush();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

} else {

return null;

}

}

时间: 2024-12-23 08:14:26

SpringMVC 异常处理的相关文章

SpringMVC异常处理

为了统一处理代码执行过程中出现的异常.给用户一个更友好的异常界面,须要引入springMVC的异常处理功能,为了演示这个功能,本文实现一个比較经常使用的需求. 将所有的异常归为两类,一类是程序猿自己创建的异常类,还有一类是系统或框架定义的异常类.程序猿自己定义的异常类在界面上输出异常信息,而系统定义好的异常所有统一输出"未知错误". 引发异常后.跳转到异常页面,而且进行读秒,三秒后自己主动跳转到请求发生的页面,或者由程序猿定义好的页面. 为了实现该功能,首先写一个自己的异常类,我这里命

SpringMVC异常处理方式

一.描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍使用Spring MVC统一处理异常的解决和实现过程. 二.Spring MVC处理异常常见方式 Sp

SpringMVC——异常处理

Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射.数据绑定以及目标方法执行时发生的异常. SpringMVC 提供的 HandlerExceptionResolver 的实现类 <mvc:annotation-driven/>在容器中注册org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver Except

SpringMVC异常处理一

现在模拟登录的时候,如果用户名或者密码发生异常的时候,使其跳转到自定义的错误页面中去 error.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu

SpringMVC源码分析-400异常处理流程及解决方法

本文设计SpringMVC异常处理体系源码分析,SpringMVC异常处理相关类的设计模式,实际工作中异常处理的实践. 问题场景 假设我们的SpringMVC应用中有如下控制器: 代码示例-1 @RestController("/order") public class OrderController{ @RequestMapping("/detail") public Object orderDetail(int orderId){ // ... } } 这个控制

SpringMvc如何进行异常处理以及常见的注解

1.SpringMvc异常处理方法: 1.1  局部处理  使用@ExceptionHandler注释 @ExceptionHandler //当该类中发生异常时会由该方法来处理,该方法的Exception会接收异常对象 public ModelAndView error(Exception exception) { ModelAndView mv=new ModelAndView(); mv.addObject("error", exception.getMessage()); mv

【转】springmvc源码分析链接

SpringMVC源码 SpringMVC源码分析系列 说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而 springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟 悉. 一进Spring的官网就发现了这样一排醒目的文字, spring可以让我们构造简单的.便携的.又快又易于扩展的基于jvm的系统和应用程序. 没错,基于Spr

使用Spring MVC统一异常处理实战

1 描写叙述 在J2EE项目的开发中.无论是对底层的数据库操作过程.还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常须要处理.每一个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一.维护的工作量也非常大. 那么,能不能将全部类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的. 以下将介绍使用Spring MVC统一处理异常的解决和实现过程. 2 分析 Spring MVC处理异

SpringMVC源码分析系列

说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟悉. 一进Spring的官网就发现了这样一排醒目的文字, spring可以让我们构造简单的.便携的.又快又易于扩展的基于jvm的系统和应用程序. 没错,基于Spring的MVC框架SpringMVC同样也可以构造具有这些特