SpringMVC中的异常处理

本文介绍SpringMVC中三种异常处理方法:使用SimpleMappingExceptionResolver、自定义全局异常处理器及利用@ExceptionHandler注解。通过登录校验案例展示了不同处理方式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

@Component
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;
    }
}
然后,定义异常处理类
package com.lpq.personallibrary.util.exceptionutils;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public 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";
    }













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值