Spring MVC异常处理

转自:SpringMVC学习系列(10) 之 异常处理

在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。

在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理:

一.继承HandlerExceptionResolver接口实现自己的处理方法,如:

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {   

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {   

        //添加自己的异常处理逻辑,如日志记录等        

         // TODO Auto-generated method stub
        return new ModelAndView("exception");
    }   

}

然后在项目的配置文件中添加:

<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>

这样就完成了异常的捕捉和处理。

二.我们介绍了第一种捕捉处理异常方式,但是第一种方式需要在配置文件中进行配置,有的时候我们会觉得配置文件内容太多太乱,那么我们就可以借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。

首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController,内容如下:

package com.demo.web.controllers;

import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;

public abstract class BaseController {  

    @ExceptionHandler
    public String exception(HttpServletRequest request, Exception e) {  

      //添加自己的异常处理逻辑,如日志记录   
        request.setAttribute("exceptionMessage", e.getMessage());  

        // 根据不同的异常类型进行不同处理
        if(e instanceof SQLException)
            return "testerror";
        else
            return "error";
    }  

}

其次,修改项目中HelloWorldController让它继承于BaseController以便进行测试:

public class HelloWorldController extends BaseController{
    //...内容省略
}

然后,修改HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:

//@AuthPassport
@RequestMapping(value={"/index","/hello"})
public ModelAndView index() throws SQLException{

    throw new SQLException("数据库异常。");

    /*ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("message", "Hello World!");
    modelAndView.setViewName("index");
    return modelAndView;*/
}

最后,在views文件夹中添加testerror.jsp视图来显示错误信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error!</title>
</head>
<body>
    ${exceptionMessage}
</body>
</html>

运行项目:

可以看到异常已经被捕捉并显示,这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了。

现在一般很多都是ajax调用,在方法名上@ResponseBody注解,对于这种请求可以采用:

@ExceptionHandler
public String exception(HttpServletRequest request, HttpServletResponse response, Exception e) { 

    //这里进行通用处理,如日志记录等...

     //如果是json格式的ajax请求
     if (request.getHeader("accept").indexOf("application/json") > -1
             || (request.getHeader("X-Requested-With")!= null && request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1)) {
        response.setStatus(500);
        response.setContentType("application/json;charset=utf-8");
        try {
            PrintWriter writer = response.getWriter();
            writer.write(e.getMessage());
            writer.flush();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return null;
     }
     else{//如果是普通请求
        request.setAttribute("exceptionMessage", e.getMessage()); 

        // 根据不同的异常类型可以返回不同界面
        if(e instanceof SQLException)
            return "testerror";
        else
            return "error";
    }
} 
时间: 2024-10-12 23:00:51

Spring MVC异常处理的相关文章

Spring MVC异常处理代码完整实例

Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean 原文地址:https://www.cnblogs.com/niwotaxuexiba/p/11218171.html

Spring MVC异常处理实例

以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-example.html: 例子: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schema

spring mvc 异常处理

1.编写全局异常处理类 需要实现接口 org.springframework.web.servlet.HandlerExceptionResolver 2.自定义异常 3.测试程序 4.结果 预期结果,在jsp页面显示.(这里没有设定错误页面,继续用user.jsp来显示).

Spring MVC 异常处理 - ExceptionHandler

通过HandlerExceptionResolver 处理程序异常,包括Handler映射, 数据绑定, 以及目标方法执行时的发生的异常 实现类如下 /** * 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象 * 2. @ExceptionHandler 方法的入参中不能传入 Map. 若希望把异常信息传导页面上, 需要使用 ModelAndView 作为返回值 * 3. @ExceptionHandler 方法标

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

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

Spring Boot异常处理详解

在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类. Spring Boot在启动过程中会根据当前环境进行AutoConfiguration,其中跟MVC错误处理相关的配置内容,在ErrorMvcAutoConfiguration这个类中.以下会分块介绍这个类里面的配置. 在Servlet容器中添加了一个默认的错误页面 因为ErrorMvcAuto

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多. 同时还必须考虑异常模块和日志模块.国际化的支持. 因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,

spring mvc 异常状态

spring mvc中的404: 1.mappedHandler找不到 response.sendError(HttpServletResponse.SC_NOT_FOUND); spring mvc异常机制 1.mappedHandler找不到 并且throwExceptionIfNoHandlerFound设定为true throwExceptionIfNoHandlerFound source: if (this.throwExceptionIfNoHandlerFound) { thro

Spring MVC 编程基础

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 12.0pt; font-family: Consolas } h1 { margin-top: 17.0pt; margin-right: 0cm; margin-bottom: 16.5pt; margin-left: 21.25pt; text-align: justify