SpringMVC中的异常处理

来源:互联网 发布:北京网络维护公司 编辑:程序博客网 时间:2024/06/17 12:42

1.springmvc中异常处理有三种方式

1)使用spring自带的异常处理器SimpleMappingExceptionResolver

2 ) 自定义全局异常处理器

3)使用@ExceptionHandler注解实现异常处理

本文以登录校验为例来讲解三种异常处理方法的应用

2.使用SimpleMappingExceptionResolver,它实现了HandlerExceptionHandler接口

首先定义自己的异常

public class LibraryException extends Exception {    public String message;    public LibraryException(){}    public LibraryException(String message){        this.message=message;    }    @Override    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}
在logincontroller中会抛出自定义的异常

@RequestMapping(value="/login",method=RequestMethod.POST)    public String login(HttpServletRequest request,HttpServletResponse response,                        String username, String password,String captcha,                        @RequestParam(value="rememberme",defaultValue="0") int rememberme) throws Exception {        if(!validateUtils.validate(request,response,captcha)){            throw new LibraryException("验证码输入不正确!");        }        return "redirect:list-books";    }
在springmvc的配置文件中需要配置该异常处理器

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">        <!-- 定义默认的异常处理页面 -->        <property name="defaultErrorView" value="/WEB-INF/views/error.jsp"/>        <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->        <property name="exceptionAttribute" value="exception"/>        <!-- 定义需要特殊处理的异常,可以是自定义的异常(记得配置为bean)-->        <property name="exceptionMappings">            <props>                <prop key="com.lpq.personallibrary.util.exceptionutils.LibraryException">                    library_error</prop>            </props>        </property>    </bean>


3.自定义全局异常处理器

1)跟上面一样定义LibraryException异常,在controller中抛出异常;2)自定义全局异常处理器MyHandlerExceptionResolver来实现HandlerExceptionResolver接口首先,判断异常的类型是否是自定义的异常,如果是则转换成自定义异常,如果不是实例化一个自定义的异常(信息为“系统未定义异常!”);3)定义ModelAndView,添加异常信息和错误页面的名称
public class MyExceptionResolver implements HandlerExceptionResolver {    @Override    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,                                         Object handler, Exception ex) {        LibraryException le=null;        if(ex instanceof LibraryException){            le=(LibraryException)ex;        }else{            le=new LibraryException("系统未知异常!");        }        ModelAndView modelAndView=new ModelAndView();        modelAndView.addObject("exception",le.getMessage());        modelAndView.getModel().put("exception",le.getMessage());        modelAndView.setViewName("error");        return modelAndView;    }}
jsp页面中error.jsp可以获取其中的异常信息

%@ page contentType="text/html;charset=UTF-8" language="java"%><html><head>    <title>Title</title></head><body>错误页面!2${requestScope.exception}${exception}</body></html>

4.基于@ExceptionController 和 @ControllerAdvice的注解

这种方法比较简单,不需要进行配置,如果没有@ControllerAdvice注解,则@ExceptionHanler注解需要和contoller在同一个类中

  • @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度,需要指明需要处理的异常类型
  • @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离
首先定义异常

package com.lpq.personallibrary.util.exceptionutils;import org.springframework.stereotype.Component;@Componentpublic class LibraryException extends Exception {    public String message;    public LibraryException(){}    public LibraryException(String message){        this.message=message;    }    @Override    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}
然后,定义异常处理类
package com.lpq.personallibrary.util.exceptionutils;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.servlet.ModelAndView;@ControllerAdvicepublic class ExceptionHandler {    //该注释指明LibraryException在此方法中进行处理    @org.springframework.web.bind.annotation.ExceptionHandler(LibraryException.class)    public ModelAndView libraryExceptionHandler(LibraryException ex){        ModelAndView modelAndView=new ModelAndView();        modelAndView.getModel().put("exception",ex);        modelAndView.setViewName("library_error");        return modelAndView;    }    //注解中指明Exception.class,所以前面未能匹配的异常进入此方法进行处理    @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)    public ModelAndView allExceptionHanlder(Exception ex){        ModelAndView modelAndView=new ModelAndView();        modelAndView.getModel().put("exception",ex);        modelAndView.setViewName("error");        return modelAndView;    }}


在controller中抛出的异常都能得到相应的处理
@RequestMapping(value="/login",method=RequestMethod.POST)    public String login(HttpServletRequest request,HttpServletResponse response,                        String username, String password,String captcha,                        @RequestParam(value="rememberme",defaultValue="0") int rememberme) throws Exception {        if(!validateUtils.validate(request,response,captcha)){            throw new LibraryException("验证码输入不正确!");            //throw new RuntimeException("运行时异常");        }        return "redirect:list-books";    }













原创粉丝点击