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;}@Overridepublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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)@ResponseBodypublic 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 {@Beanpublic 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为每页显示条数
结果:
最后查询结果,可以看到返回数据已经分好页了。
SpringBoot+Vue从零开始做网站8-全局异常处理和使用mybatis-plus分页插件相关推荐
- SpringBoot集成MyBatis的分页插件PageHelper
[写在前面] 项目的后台管理系统需要展示所有资源信息,select * 虽然方便但数据量过于庞大会严重降低查找效率,页面加载慢,用户体验差.分页自然是必要选择,但原生的方法过于繁杂.MyBatis的分 ...
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
俗话说:好?不吃回头草,但是在这里我建议不管你是好马还是不好马,都来吃吃,带你复习一下分页插件PageHelper. 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心 ...
- SpringBoot+Vue+HIKVSION实现摄像头多选并多窗口预览(插件版)
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客 SpringBoot+Vue+O ...
- 在springboot中使用PageHelper(mybatis的分页插件) 以及自定义分页
PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库, 例如mysql. oracle.mariaDB. DB2. SQLite.Hsqldb等. 本项目 ...
- springboot注解 + mybatisplus拦截器实现数据权限拦截(兼容分页插件)
需求 要求在同一个数据请求方法中,根据不同的权限返回不同的数据集,而且无需并且不能由研发编码控制. 设计思路 竟然要实现查询语句与权限解耦,第一想法联想到的就是AOP,拦截所有的底层sql,加入过滤条 ...
- 《SpringBoot+vue全栈开发实战项目》笔记
前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...
- SpringBoot+vue全栈开发实战笔记太香了
Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能够快速 ...
- springboot+vue项目大型实战(一)后端开发
源码下载地址!!!点我 数据库创建表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- ...
- 基于Springboot+Vue+Mybatis的小说阅读管理系统
一.基于Springboot+Vue+Mybatis的小说阅读管理系统 此项目为基于Springboot+Vue+Mybatis的小说阅读管理系统,主要分为用户端和管理端两个模块. 用户端主要支撑登录 ...
最新文章
- PHP开启session的函数,ThinkPHP中session函数详解
- 网络营销外包——改善企业网站排名现状网络营销外包少不了
- C#中HttpClient使用注意:预热与长连接
- 关闭Eclipse光标悬浮自动提示
- 区块链在阿里巴巴天猫中的应用
- 牛客15555 1 + 2 = 3?
- 四、Python第四课——Python中列表及其操作(增删改查)
- WebStorm 常用快捷键大全 - 归纳总结篇
- 狂神说学习笔记 Java流程控制
- jquery实现图片放大效果
- Linux uptime命令详解
- java方面的文献综述怎么写_java论文参考文献
- java中级开发工程师_Java中级开发工程师知识点归纳
- php yml,YAML、YML在线编辑器(格式化校验)
- java程序设计 论文,Java程序设计毕业论文
- PHP 垃圾回收机制
- 计算机数值怎么看大小,笔记本电脑尺寸怎么看_笔记本电脑尺寸查询
- Your proxy appears to only use HTTP and not HTTPS, try changing your proxy URL to be HTTP. (解決)
- Unity接入OneStore内购
- mybatis association内嵌collection踩坑
热门文章
- 4、js数组方法Map、fileter、reduce、sort
- 虹膜识别—DeepIrisNet2
- mysql using temporary_执行计划中Using filesort,Using temporary相关语句的优化解决_MySQL
- centos 7 显示远程窗口到本地
- MG3680无法在网络上检测到打印机
- 织梦如何添html5播放器,织梦ckplayer视频播放器插件安装使用教程
- HTML游戏黑屏,“网页游戏黑屏,白屏,无法调出flash.”的解决方案
- 我的世界Minecraft基岩版开服服务器教程(Windows)开服器开服包下载开服网站服务器要多少钱开服核心开服端下载
- 微信小程序 --- 日历效果
- 侠客行:一技压身,天下行走