1.pom文件引用

Spring Boot 2.3 1 之前,只需要引用spring-boot-starter-web

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot 2.3 1 之后,spring-boot-starter-validation 已经不包括在了 spring-boot-starter-web 中,需要我们手动加上。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
如果是普通 Java 程序
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.9.Final</version>
</dependency>

2.全局异常处理类ExceptionHandler

package com.xinghuo.exception;import java.security.SecureRandom;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
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 com.alibaba.fastjson.JSONObject;
import com.xinghuo.utils.Result;import lombok.extern.slf4j.Slf4j;/*** 异常处理器* @author xietao* 2022年6月24日 上午10:47:39**/
@RestControllerAdvice
@Slf4j
public class XHExceptionHandler {/*** 处理自定义异常*/@ExceptionHandler(XHException.class)public Result<?> handleXHException(XHException e) {Result<Object> r = new Result<Object>();r.setCode(e.getCode());r.setMessage(e.getMessage());r.setSuccess(false);return r;}@ExceptionHandler(InvalidTokenException.class)public Result<?> handleInvalidTokenException(InvalidTokenException e) {log.error("token失效:"+e.getToken());return Result.noauth(e.getMessage());}/*** 处理Content-Type异常*/@ExceptionHandler(HttpMediaTypeNotSupportedException.class)public Result<?> handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) {return Result.error("Content-Type设置错误", e.getMessage());}/*** 处理Request method异常*/@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public Result<?> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {return Result.error("请求方式错误", e.getMessage());}/*** 处理validate的校验异常*/@ExceptionHandler(BindException.class)public Result<?> handleBindException(BindException e) {return wrapErrors(e.getAllErrors());}/*** 处理RequestBody validate的校验异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public Result<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {return wrapErrors(e.getBindingResult().getAllErrors());}/*** 处理参数列表字段validate的校验异常*/@ExceptionHandler(ConstraintViolationException.class)public Result<?> handleConstraintViolationException(ConstraintViolationException e) {return wrapErrors(e.getMessage());}@ExceptionHandler(Exception.class)public Result<?> handleException(Exception e) {log.error(e.getMessage(), e);return Result.error("系统出错");}/*** 返回validate异常提示* @param errors* @return*/private Result<?> wrapErrors(List<ObjectError> errors) {if(CollectionUtils.isEmpty(errors)){return Result.error("请求参数错误");}//validate的校验错误提示SecureRandom random = new SecureRandom();JSONObject json = new JSONObject();errors.forEach(error->{if(error instanceof FieldError) {FieldError fieldError = (FieldError)error;json.put(fieldError.getField(), error.getDefaultMessage());} else {json.put(error.getObjectName()+random.nextInt(), error.getDefaultMessage());}});return Result.error("请求参数错误", json);}/*** 返回validate异常提示* @param errors* @return*/private Result<?> wrapErrors(String message) {if(StringUtils.isBlank(message)){return Result.error("请求参数错误");}//validate的校验错误提示if (message.indexOf(".") == -1 || message.indexOf(":") == -1) {return Result.error("请求参数错误");}String prefix = message.split("\\.")[0];message = message.replace(prefix + ".", "");JSONObject json = new JSONObject();// 判断是否存在多个字段if (message.indexOf(",") == -1) {String[] msgChildArr = message.split(":");json.put(msgChildArr[0].trim(), msgChildArr[1].trim());}else{String[] msgArr = message.split(",");for (String msg : msgArr) {String[] msgChildArr = msg.split(":");json.put(msgChildArr[0].trim(), msgChildArr[1].trim());}}return Result.error("请求参数错误", json);}}

3.返回封装类

package com.xinghuo.utils;import java.io.Serializable;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;/*** 接口返回数据格式*/
@Data
@ApiModel(value = "接口返回对象", description = "接口返回对象")
public class Result<T> implements Serializable {private static final long serialVersionUID = 1L;/*** 成功标志*/@ApiModelProperty(value = "成功标志")private boolean success = true;/*** 返回处理消息*/@ApiModelProperty(value = "返回处理消息")private String message = "操作成功!";/*** 返回代码*/@ApiModelProperty(value = "返回代码")private Integer code = 0;/*** 返回数据对象 data*/@ApiModelProperty(value = "返回数据对象")private Object result;/*** 时间戳*/@ApiModelProperty(value = "时间戳")private long timestamp = System.currentTimeMillis();public Result() {}public Result<T> success(String message) {this.message = message;this.code = "200";this.success = true;return this;}public static Result<Object> ok() {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode("200");r.setMessage("成功");return r;}public static Result<Object> ok(String msg) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode("200");r.setMessage(msg);return r;}public static Result<Object> okResult(String data) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode("200");r.setResult(data);return r;}public static Result<Object> ok(Object data) {Result<Object> r = new Result<Object>();r.setSuccess(true);r.setCode("200");r.setResult(data);return r;}public static Result<Object> error(String msg) {return error("500", msg);}public static Result<Object> error(int code, String msg) {Result<Object> r = new Result<Object>();r.setCode(code);r.setMessage(msg);r.setSuccess(false);return r;}public static Result<Object> error(String msg, Object result) {Result<Object> r = new Result<Object>();r.setCode("500");r.setMessage(msg);r.setSuccess(false);r.setResult(result);return r;}/*** 无权限访问返回结果*/public static Result<Object> noauth(String msg) {return error("401", msg);}}

SpringBoot基础框架-Java文档类资源-CSDN下载

注意:如果是spring boot2.0之前,ConstraintViolationException会抛出异常为null,不会展示出错的字段名,不够友好,因为validation版本问题,可以引入高版本

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency>

SpringBoot注解校验validation自定义异常返回错误消息给前端相关推荐

  1. nlv sqlserver_未能使用提供程序“DataProtectionConfigurationProvider”进行解密。提供程序返回错误消息为: 该项不适于在指定状态下使用...

    hishop访问报错未能使用提供程序"DataProtectionConfigurationProvider"进行解密.提供程序返回错误消息为: 该项不适于在指定状态下使用, 您可 ...

  2. springboot参数校验validation

    文章目录 1. 引入 2. 基本使用 2.1 引入依赖 2.2 基本使用 2.3 注解介绍 2.4 返回值完善 2.5 统一异常处理 2.6 @Valid和@Validate注解 3. 分组校验 4. ...

  3. excel导入数据校验_Excel数据验证错误消息

    excel导入数据校验 Do you like to use error checking in Excel, so that problem cells are flagged, or do you ...

  4. java filter 返回错误消息_利用java filter 实现业务异常拦截 跳转到错误信息提示页面...

    1.缘由:我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理机制,我们在业务层会跑出我们遇到业务 ...

  5. java filter 返回错误消息_java filter 导致错误310

    filter代码:packagecom.src.tool;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servle ...

  6. SAP Data Intelligence API返回错误消息 - Fordidden cross-site request

    解决方案 添加HTTP field - X-Requested-With HTTP value - XMLHttpRequest

  7. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  8. 在ASP.NET Web API中返回错误的最佳实践

    本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...

  9. Springboot 使用校验框架validation校验

    作者:双斜杠少年 blog.csdn.net/u012373815/article/details/72049796 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上 ...

  10. Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际化失败消息...)【享学Spring】

    每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 前言 一般来说,对于web项目我们都有必要对请求参数进行校验,有的前端使用JavaScript校验,但是为了安全起见后端的校验都是必须的. ...

最新文章

  1. 補丁文件patch制作流程
  2. Centos8 yum 阿里源配置
  3. 计算机硬件结构中负责识别,计算机硬件基本结构树状图
  4. 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字
  5. shell脚本获取绝对路径
  6. SAP云平台CloudFoundry环境试用帐号过期了怎么办
  7. 进程间基于共享存储区的通信_IPC(进程间通讯):inter process communication
  8. 学习 vuex 源码整体架构,打造属于自己的状态管理库
  9. python基础之名称空间和作用域、函数嵌套
  10. 【产品活动】阿里云GPU云服务器年付5折!阿里云异构计算助推行业发展!
  11. C++的基础知识【面试遇到】
  12. B树、B-树、B+树、B*树都是什么
  13. 用c语言库函数进行排序
  14. 洛谷OJ_P1009涉及的高精度算法
  15. MAC下显示隐藏文件夹
  16. VSCode选择远程服务器的虚拟环境
  17. C语言每日一练——第35天:打印菱形
  18. 目不暇接 时尚艳丽的新款苹果手机 MAC APPLE
  19. 批量下载ERA5数据(Python+IDM)
  20. 相机不小心格式化了怎么恢复?内存卡格式化后能恢复数据吗

热门文章

  1. 独自一人开发返利平台小程序日记(准备开源中):万事开头难,既然做了,那就只能咬牙坚持了
  2. App项目开发流程图解
  3. 关于为什么不能减小rb来消除截止失真
  4. 单片机广告灯实验总结_单片机流水灯实验总结精选 .doc
  5. 大数据核心技术是什么 怎么掌握Hadoop知识
  6. 分享,请不要忽视了作者的版权
  7. 鸿蒙开发必备书籍整理【收藏系列】
  8. win10自带看图工具找不到了怎么办?
  9. Base理论是什么?之前也聊到过CAP理论
  10. php msvcr100.dll丢失,WAMP启动报错MSVCR100.dll丢失