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. python绘制饼图-Python使用Plotly绘图工具,绘制饼图
  2. ASP.NET+SQL创建存储过程
  3. C语言试题四之计算并输出3到n之间所有素数的平方根之和
  4. 牛客网_Go语言相关练习_选择题(2)
  5. Python中曲率与弯曲的转换_1000R曲率更具沉浸感!三星T55曲面显示器评测
  6. BAT研发Java面试36题总结:Spring+Redis+Docker+Dubbo
  7. 不能算是读后感的读后感
  8. 复习zabbix配置agent过程
  9. 黑客发现瑞士电子选举系统中的多个漏洞并获奖2.7万美元
  10. DL-C_1_week_1_1
  11. html5总结2000字,建筑识图实训总结2000字6篇范文
  12. Windows文件系统-NTFS文件系统
  13. Python画中国地图-数据导入
  14. 快速查看网页元素的CSS样式
  15. 分享淘宝的IP地址库查询接口
  16. [附源码]SSM计算机毕业设计高校奖学金评定管理系统JAVA
  17. 小甲鱼python课后题和答案简书_【py小甲鱼笔记】-函数
  18. docker部署codereview/gerrit
  19. 告诉你那里最受欢迎,python爬取全国13个城市旅游数据
  20. PostgreSQL 源码解读(147)- Storage Manager#3(fsm_search函数)

热门文章

  1. 窄带物联网应用于工业计算机,工业物联网嵌入式边缘计算机的制作方法
  2. 怎么在linux虚拟机装软件下载,如何在linux虚拟机中下载安装gcc
  3. CentOS换源、linux配置IP、腾讯云SHH秘钥、公钥
  4. 利用免费的必应 Bing 自定义搜索打造站内全文搜索
  5. windows基线加固
  6. deepin15.9的linux内核版本,深度Deepin 15.9操作系统首次更新内容
  7. idea 设置全局豆沙绿
  8. php 页面字体大小,网页中各种设置字体大小的方法总结
  9. 百度站点LOGO尺寸标准
  10. 微信第三方平台服务器,微信三方平台接入