个人博客开发之blog-api项目统一全局异常处理和参数验证

本文主要是介绍个人博客开发之blog-api项目统一全局异常处理和参数验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

项目开发中异常捕获,抛出,记录,也是非常重要的,便于我们以后项目bug定位追踪,

Hibernate Validator 参数校验

通过整合spring-boot-starter-validation进行全局参数校验

  <!--参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

具体使用请参考我这两篇文章

SpringBoot Validation优雅的全局参数校验

SpringBoot Validation详解自定校验和分组校验

全局异常捕获GlobalExceptionHandler

package cn.soboys.core;import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.soboys.core.authentication.AuthenticationException;
import cn.soboys.core.ret.Result;
import cn.soboys.core.ret.ResultCode;
import cn.soboys.core.ret.ResultResponse;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Path;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;/*** @author kenx* @version 1.0* @date 2021/6/17 20:19* 全局异常统一处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 处理 json 请求体调用接口对象参数校验失败抛出的异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public Result jsonParamsException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();List errorList = CollectionUtil.newArrayList();for (FieldError fieldError : bindingResult.getFieldErrors()) {String msg = String.format("%s%s;", fieldError.getField(), fieldError.getDefaultMessage());errorList.add(msg);}return ResultResponse.failure(ResultCode.PARAMS_IS_INVALID, errorList);}/*** 处理单个参数校验失败抛出的异常*/@ExceptionHandler(ConstraintViolationException.class)public Result ParamsException(ConstraintViolationException e) {List errorList = CollectionUtil.newArrayList();Set<ConstraintViolation<?>> violations = e.getConstraintViolations();for (ConstraintViolation<?> violation : violations) {StringBuilder message = new StringBuilder();Path path = violation.getPropertyPath();String[] pathArr = StrUtil.splitToArray(path.toString(), ".");String msg = message.append(pathArr[1]).append(violation.getMessage()).toString();errorList.add(msg);}return ResultResponse.failure(ResultCode.PARAMS_IS_INVALID, errorList);}/*** @param e* @return 处理 form data方式调用接口对象参数校验失败抛出的异常*/@ExceptionHandler(BindException.class)public Result formDaraParamsException(BindException e) {List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();List<String> collect = fieldErrors.stream().map(o -> o.getField() + o.getDefaultMessage()).collect(Collectors.toList());return ResultResponse.failure(ResultCode.PARAMS_IS_INVALID, collect);}/*** 请求方法不被允许异常*/@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public Result httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {return ResultResponse.failure(ResultCode.METHOD_NOT_ALLOWED);}/*** @param e* @return Content-Type/Accept 异常* application/json* application/x-www-form-urlencoded*/@ExceptionHandler(HttpMediaTypeNotSupportedException.class)public Result httpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) {return ResultResponse.failure(ResultCode.BAD_REQUEST);}/*** handlerMapping  接口不存在跑出异常** @param e* @return*/@ExceptionHandler(NoHandlerFoundException.class)public Result noHandlerFoundException(NoHandlerFoundException e) {return ResultResponse.failure(ResultCode.NOT_FOUND, e.getMessage());}/*** 认证异常* @param e* @return*/@ExceptionHandler(AuthenticationException.class)public Result UnNoException(AuthenticationException e) {return ResultResponse.failure(ResultCode.UNAUTHORIZED,e.getMessage());}/**** @param e 未知异常捕获* @return*/@ExceptionHandler(Exception.class)public Result UnNoException(Exception e) {return ResultResponse.failure(ResultCode.INTERNAL_SERVER_ERROR, e.getMessage());}
}

具体详细使用请参考我这篇文章 SpringBoot优雅的全局异常处理

关注公众号猿小叔获取更多干货分享

在这里插入图片描述

这篇关于个人博客开发之blog-api项目统一全局异常处理和参数验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066716

相关文章

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像