SpringMVC全局异常处理小结

 更新时间:2024年03月29日 14:26:29   作者:周大福ye  
在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护,本文介绍SpringMVC全局异常处理,感兴趣的朋友一起看看吧

一、为什么要全局异常处理?

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

二、异常处理思路(参考下图)

三、SpringMVC异常分类

   1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; 
   2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
   3)使用@ControllerAdvice + @ExceptionHandler

四、综合案例

1、首先创建一个error页面,为方便后面异常处理操作

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>
    系统错误,请联系管理员!!
</h1>
${msg}
</body>
</html>

 4.1 SpringMVC自带的简单异常处理器

  SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

1)配置SpringMVC简单异常处理器

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <!-- 定义默认的异常处理页面 -->
       <property name="defaultErrorView" value="error"/>
       <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> 
       <property name="exceptionAttribute" value="ex"/>
       <!-- 定义需要特殊处理的异常,这是重要点 --> 
       <property name="exceptionMappings">
           <props> <!--异常类型 错误视图-->       
               <prop key="java.lang.RuntimeException">error</prop>
           </props>
           <!-- 还可以定义其他的自定义异常 -->
       </property>
   </bean> 

2)方法中抛出此异常

 /**
     * 返回实体类的JSON数据
     * @param bookId
     * @return
     */
   @RequestMapping("/querySingleBook")
   @ResponseBody
   public Book querySingleBook(Integer bookId){
       Book book = bookService.selectByPrimaryKey(bookId);
       book.setCreatedate(new Date());
       //此处只是为了进行案例演示
       if(bookId<100){
           throw new RuntimeException("查询的书本编号小于100,异常抛出!!");
       }
       return book;
   }

3)页面效果

4.2 通过HandlerExceptionResovler接口实现全局异常  

   注:
   1)通过instanceof判断异常类型
   2)通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据;

 1)通过HandlerExceptionResovler接口实现全局异常处理器

package com.zking.ssm.book.exception;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口
 */
@Component
public class GlobalException implements HandlerExceptionResolver {
    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o 异常处理的目标
     * @param e 异常处理的类型
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("error");
        //判断异常的分类
        if(e instanceof RuntimeException){
                RuntimeException ex=(RuntimeException)e;
                System.out.println(ex.getMessage());
                mv.addObject("msg",ex.getMessage());
        }
        return mv;
    }
}

2)创建异常类

package com.zking.ssm.book.exception;
public class BusinessException extends RuntimeException {
    public BusinessException() {
    }
    public BusinessException(String message) {
        super(message);
    }
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
    }
    public BusinessException(Throwable cause) {
        super(cause);
    }
}
@RequestMapping("/querySingleBook")
    @ResponseBody
    public Book querySingleBook(Integer bookId){
        Book book = bookService.selectByPrimaryKey(bookId);
        if(bookId>100)
            throw new BusinessException("书本编号小于100,异常抛出!!!");
        book.setDate(new Date());
        return book;
    }

3)页面效果

4.3 使用@ControllerAdvice+@ExceptionHandler实现全局异常

 1)创建全局异常处理器

package com.zking.ssm.book.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map;
/**
 * SpingMVC提供的第三种种全局异常处理方式
 * 1)@ControllerAdvice +@ExceptionHandler
 * 2)@RestControllerAdvice +@ExceptionHandler
 *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器
 */
@ControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public ModelAndView exceptionHandler(Exception e){
            ModelAndView mv=new ModelAndView();
            //设置错误页面
            mv.setViewName("error");
            //判断异常类型
            if(e instanceof BusinessException){
            BusinessException ex=(BusinessException)e;
                mv.addObject("msg","系统繁忙,请稍后再试.......");
            }
            mv.setView(new MappingJackson2JsonView());
            return mv;
        }
}

2)页面效果

3)返回异常信息和状态码、返回JSON数据格式

package com.zking.ssm.book.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map;
/**
 * SpingMVC提供的第三种种全局异常处理方式
 * 1)@ControllerAdvice +@ExceptionHandler
 * 2)@RestControllerAdvice +@ExceptionHandler
 *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器
 */
@RestControllerAdvice
public class GlobalException2{
        @ExceptionHandler
        public Map<String, Object> exceptionHandler(Exception e){
            Map<String, Object> json=new HashMap();
            //判断异常类型
            if(e instanceof BusinessException){
                json.put("msg","系统繁忙,请稍后再试.......");
                json.put("code",500);
            }
            return json;
        }
}

4)页面效果

 希望可以给您带来帮助,若有建议可以私信作者哦~

到此这篇关于SpringMVC之全局异常处理的文章就介绍到这了,更多相关SpringMVC全局异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 多线程(多窗口卖票实例讲解)

    多线程(多窗口卖票实例讲解)

    下面小编就为大家带来一篇多线程(多窗口卖票实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • springboot配置多数据源后mybatis拦截器失效的解决

    springboot配置多数据源后mybatis拦截器失效的解决

    这篇文章主要介绍了springboot配置多数据源后mybatis拦截器失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中图像锐化操作的方法详解

    Java中图像锐化操作的方法详解

    这篇文章主要给大家介绍了关于Java中图像锐化操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 在Spring MVC中处理请求参数的方法总结

    在Spring MVC中处理请求参数的方法总结

    在Spring MVC中处理请求参数是通过使用各种注解来实现的,本文给大家介绍了在Spring MVC中处理不同类型请求参数的方法,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-08-08
  • 基于java中反射的总结分析

    基于java中反射的总结分析

    所谓反射,就是根据一个已经实例化了的对象来还原类的完整信息
    至少对我而言,我认为它带给我的好处是,让我从下往上的又了解了一遍面向对象

    2013-05-05
  • Mybatis-Plus根据自定义注解实现自动加解密的示例代码

    Mybatis-Plus根据自定义注解实现自动加解密的示例代码

    我们把数据存到数据库的时候,有些敏感字段是需要加密的,从数据库查出来再进行解密,如果我们使用的是Mybatis框架,那就跟着一起探索下如何使用框架的拦截器功能实现自动加解密吧,需要的朋友可以参考下
    2024-06-06
  • java如何获得redis所有的key-value

    java如何获得redis所有的key-value

    这篇文章主要介绍了java如何获得redis所有的key-value,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 解决报java.lang.AssertionError错误的问题

    解决报java.lang.AssertionError错误的问题

    这篇文章主要介绍了解决报java.lang.AssertionError错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Nacos Discovery服务治理解决方案

    Nacos Discovery服务治理解决方案

    DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服务,这篇文章主要介绍了Nacos Discovery服务治理,需要的朋友可以参考下
    2022-11-11
  • Java线上死锁问题从定位到解决的全链路指南

    Java线上死锁问题从定位到解决的全链路指南

    在分布式系统高并发场景下,死锁如同定时炸弹,随时可能引发服务雪崩,本文将分享一套完整的死锁应对策略,结合实战案例与生产级解决方案,助你快速化解危机,需要的朋友可以参考下
    2025-06-06

最新评论