个人博客开发之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

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa