IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot+Vue从零开始做网站8-全局异常处理和使用mybatis-plus分页插件 -> 正文阅读

[Java知识库]SpringBoot+Vue从零开始做网站8-全局异常处理和使用mybatis-plus分页插件

全局异常处理用于前端统一错误显示,还有就是后端分页插件,使用的mybatis-plus。

SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理,需要配合@ExceptionHandler使用。当将异常抛到controller时,可以对异常进行统一处理,规定返回的json格式或是跳转到一个错误页面

@ExceptionHandler注解我们一般是用来自定义异常的,可以认为它是一个异常拦截器(处理器)。@ExceptionHandler必须要求该方法必须要和出现问题的控制器在一个类中,才能生效。如果别的类报空指针异常,则不会进该异常处理方法,必须要结合@ControllerAdvice和@ExceptionHandler一起使用。

自定义异常类,用于处理我们发生的业务异

package com.zjlovelt.exception;

import com.zjlovelt.common.result.Result;

/**
 * 自定义异常类
 */
public class AllException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    /**
     * 错误信息
     */
    protected String errorMsg;

    public AllException() {
        super();
    }

    public AllException(Result errorInfoInterface) {
        this.errorMsg = errorInfoInterface.getMsg();
    }

    public AllException(Result errorInfoInterface, Throwable cause) {
        this.errorMsg = errorInfoInterface.getMsg();
    }

    public AllException(String errorMsg) {
        super(errorMsg);
        this.errorMsg = errorMsg;
    }


    public AllException(String errorMsg, Throwable cause) {
        super(errorMsg, cause);
        this.errorMsg = errorMsg;
    }



    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public String getMessage() {
        return errorMsg;
    }

    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

}

自定义全局异常处理类

package com.zjlovelt.exception;

import com.zjlovelt.common.result.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.sql.SQLException;

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理自定义的业务异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = AllException.class)
    @ResponseBody
    public  Result bizExceptionHandler(HttpServletRequest req, AllException e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生业务异常!原因是:{}",e.getErrorMsg());

        return Result.fail(e.getErrorMsg());
    }

    /**
     * 处理空指针的异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =NullPointerException.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, NullPointerException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生空指针异常!原因是:",e);
        return Result.fail("系统异常");
    }

    /**
     * 处理索引越界异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =IndexOutOfBoundsException.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, IndexOutOfBoundsException e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("索引越界异常!原因是:",e);
        return Result.fail("系统异常");
    }

    /**
     * 处理类未找到异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =ClassNotFoundException.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, ClassNotFoundException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生类未找到异常!原因是:",e);
        return Result.fail("系统异常");
    }


    /**
     * 处理SQL异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = SQLException.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, SQLException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生SQL异常!原因是:",e);
        return Result.fail("系统异常");
    }

    /**
     * 处理IO异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = IOException.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, IOException e)  {
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("发生IO异常!原因是:",e);
        return Result.fail("系统异常");
    }


    /**
     * 处理其他异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public Result exceptionHandler(HttpServletRequest req, Exception e){
        logger.error("URL : " + req.getRequestURL().toString());
        logger.error("HTTP_METHOD : " + req.getMethod());
        logger.error("未知异常!原因是:",e);
        return Result.fail("系统异常");
    }



}

Result统一返回类

controller层写个测试接口:??

  @GetMapping(value = "/test")
    public String test(String a){
        int b =  Integer.parseInt(a);
        System.out.print(b);
        return "";
    }

最后我们来调用这个接口试一下这些异常的处理情况

首先试一下空指针异常

?

然后类型转换异常

?

我们直接抛出所有异常信息,对用户而言是非常不友好的。可以看到遇到这些异常不再是返回异常信息而是自己定义的内容了,对用户比较友好些。

自义定全局异常处理除了可以处理上述的数据格式之外,也可以处理页面的跳转,只需在新增的异常方法的返回处理上填写该跳转的路径并不使用ResponseBody 注解即可。在GlobalExceptionHandler类中使用的是ControllerAdvice注解,而非RestControllerAdvice注解,如果是用的RestControllerAdvice注解,它会将数据自动转换成JSON格式,这种于Controller和RestController类似,所以我们在使用全局异常处理的之后可以进行灵活的选择处理。

后端使用mybatis-plus框架的分页插件

因为之前是用的mybatis,引入mybatis-plus后注意一些修改

删掉pom中mybatis-spring-boot-starter的配置,把配置文件中的mybatis配置统统改为

#springboot整合mybatis的配置
#指定实体类位置,在mapper中就不用写全路径
mybatis-plus.type-aliases-package: com.zjlovelt.entity
#映射mapper的位置,和dao层接口对应,一定要对应mapper映射xml文件的所在路径
mybatis-plus.mapper-locations=classpath:mapping/*.xml
# 配置打印 SQL 语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

然后就是配置分页插件

新增一个配置类MybatisConfig

package com.zjlovelt.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分页模型:采用Page作为统一的简单分页模型,封装了查询数据列表、总数、每页显示条数(默认 10)、当前页、排序字段信息等内容。

直接使用

controller:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

    @RequestMapping("/pageList")
    public Page<SysDataDictionary> pageList(Long pageIndex, Long pageSize,SysDataDictionary sysDataDictionary) {
        if(pageIndex==null || pageIndex == 0){
            pageIndex = 1L;
        }
        if(pageSize==null || pageSize == 0){
            pageSize = 10L;
        }
        Page<SysDataDictionary> page = new Page<>(pageIndex, pageSize);
        return dataDictionaryService.selectByPage(page, sysDataDictionary);
    }

service:

 public Page<SysDataDictionary> selectByPage(Page page, SysDataDictionary dataDictionary) {
        List<SysDataDictionary> list = sysDataDictionaryMapper.selectByPage(page, dataDictionary);
        page.setRecords(list);
        return page;
    }

mapper:

List<SysDataDictionary> selectByPage(Page page, SysDataDictionary dataDictionary);

 <!-- 分页查询 -->
  <select id="selectByPage" resultMap="BaseResultMap" parameterType="com.zjlovelt.entity.SysDataDictionary">
    select
    <include refid="Base_Column_List" />
    from sys_data_dictionary
    <where>
       del_flag = '0'
      <if test="dataDictionary.fkCategoryId != null and dataDictionary.fkCategoryId != '' ">
        and fk_category_id = #{dataDictionary.fkCategoryId}
      </if>
      <if test="dataDictionary.name != null and dataDictionary.name != ''">
       and name like CONCAT('%',CONCAT(#{dataDictionary.name},'%'))
     </if>
    </where>
    order by fk_category_id desc
  </select>

这样一个分页查询就写好了,用postman调用测试

传入参数pageIndex 为当前页码 pageSize为每页显示条数

?

结果:

?

最后查询结果,可以看到返回数据已经分好页了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:02:20  更:2022-06-01 15:02:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:52:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码