spring boot中使用Bean Validation做优雅的参数校验

一、Bean Validation简介

Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),目前最新稳定版2.0.2(201909)
对于spring boot应用,直接引用它提供的starter

<!--        基于注解的数据校验规范 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

二、常用注解

常用注解如下:
在这里插入图片描述
直接在Controller层使用

@RestController
@RequestMapping("/app/api")
@Validated
@Slf4j
public class SpringGuaranteeReportController {@RequestMapping("/sendSpringGuaranteeReport")public ResultObject<String> sendSpringGuaranteeReport(@Min(value = 1) @Max(value = 2) Integer mmsType,@Min(value = 1) @Max(value = 2) Integer groupType,@NotBlank String opTime) {…………}
}

一个简单的接口,传入一个Person对象,加上@Valid启用校验,bindingResult里面就包含了参数校验的结果

@Data
public class Person {@NotBlank(message = "姓名不能为空")private String name;@NotBlank(message = "性别不能为空")private String sex;@NotNull(message = "年龄不能为空")@Max(value = 100, message = "年龄不能超过100")private Integer age;@Email(message = "电子邮箱格式错误")private String email;@Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$")private String phone;@NotEmpty(message = "兴趣不能为空")private List<String> hobby;
}

这里做了判空和基本格式校验
其中关于@NotEmpty、@NotNull、@NotBlank的区别:
简单来说,在Integer或者自定义对象中使用@NotNull,在String上使用@NotBlank,在集合上使用NotEmpty

三、配置类

validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数,通过这个配置改成:校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;/*** validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数* 通过这个配置改成:校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验*/
@Configuration
public class ValidationConfig {@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()/**failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验*/.failFast(true).buildValidatorFactory();return validatorFactory.getValidator();}@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();methodValidationPostProcessor.setValidator(validator());return methodValidationPostProcessor;}}

validate参数校验失败后,返回的json数据可能并不是咱们最终想要的,下图就是校验失败后它默认返回的数据

在这里插入图片描述
一般情况下,咱们可能只需要图中标红的那个提示信息就OK了
那怎么改它的返回数据呢?
只要添加一个异常处理类就行了,捕获抛出的异常

import com.ai.boy.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
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.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;/*** 全局异常处理*/
@ControllerAdvice
@Slf4j
public class GlobalHandlerExceptionResolver {/*** 处理请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常*/@ExceptionHandler(BindException.class)@ResponseBodypublic R BindExceptionHandler(BindException e) {String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());return R.error(message);}/*** 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException*/@ExceptionHandler(ConstraintViolationException.class)@ResponseBodypublic R ConstraintViolationExceptionHandler(ConstraintViolationException e) {String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());return R.error(message);}/*** 处理未知异常* */@ExceptionHandler(Exception.class)@ResponseBodypublic R error(HttpServletResponse response, Exception e){log.info("未知异常信息:{}",e.getMessage());return R.error("未知异常,请联系管理员!");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QGIS结合CityEngine制作卫星图地形模型

参考 https://blog.csdn.net/qq_17523181/article/details/134136379 https://blog.csdn.net/qq_17523181/article/details/134306063 安装QGIS软件与CityEngine软件 一、QGIS获取卫星图 QGIS新建工程安装插件 加入卫星图&#xff08;需要科学上网&#xff09;&#xff0c;目…

直流有刷电机调速电路,输出端内置14V钳位结构,具有电源电压范围宽、功耗小、抗干扰能力强等功能的国产芯片GS016的描述

GS016是一款直流有刷电机调速电路&#xff0c;输出端内置14V钳位结构&#xff0c;具 有电源电压范围宽、功耗小、抗干扰能力强等特点。通过桥接内部电阻网 络&#xff0c;可以改变PWM占空比输出&#xff0c;达到控制电机转速作用。GS016采用SOP14的封装形式封装。 主要特点&am…

k8s存储

目录 nfs k8s 存储卷 volume pv和pvc 生命周期: PV 的状态 一个PV从创建到销毁的具体流程 pv访问模式 静态Pv的使用 动态storage StorageClass动态创建pv的过程 搭建 StorageClass NFS&#xff0c;实现 NFS 的动态 PV 创建 nfs 理论上nfs 其实并不是存储设备&…

我在Vscode学OpenCV 色彩空间转换

文章目录 色彩【 1 】色彩空间&#xff08;色域&#xff09;&#xff08;1&#xff09;**RGB色彩空间**与xyz色彩空间的转换将 RGB 色彩空间转换为 XYZ 色彩空间将 XYZ 色彩空间转换为 RGB 色彩空间 &#xff08;2&#xff09;**CMYK色彩空间**&#xff08;3&#xff09;**HSV*…

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家&#xff0c;通过helm安装很简单&#xff0c;但是会遇到一些问题。 安装 首先登录阿里云控制台&#xff0c;在ACK集群详情页&#xff0c;进入CloudShell&#xff0c;执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…

ElasticSearch 增删改查操作

本文主要是介绍 ElasticSearch 的文档增删改查和批量操作&#xff0c;同时会介绍一些 REST API 返回状态码的具体含义。 我们先来看下这个表&#xff1a; 这个表包含了 Index、Create、Read、Update、Delete 这五种方法&#xff0c;我们先来看下 CRUD 操作的 HTTP 请求都长什么…

CSS Form表单布局

效果图 <Tab IsCard"true"><TabItem Text"表单信息-DIV版本"><div class"row"><div class"col"><label for"field1">工程名称:</label><input class"form-control" type&…

【避雷帖!】安美酷便携屏(安美特)

强烈建议别购买京东安美酷便携屏&#xff0c;太脆弱了&#xff0c;一碰就坏&#xff0c;客服态度不行&#xff0c;容易闪屏等等缺点。而且价格偏贵&#xff0c;淘宝上两百块的屏幕足够用了&#xff0c;没必要花六百多块钱&#xff0c;如果就是买来打游戏的话&#xff0c;也用不…

【腾讯云 HAI域探秘】浅尝一番AI绘画

前言 腾讯云高性能应用服务 HAI 是为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。 我之前也参与锅一个AI绘画的活动&#xff0c;是基于InsCode的&#xff0c;都可以在线训练大模型&#xff0c;开发自己的AI应用程序。 这次腾讯…

希尔顿集团旗下酒店为宾客带来冬日活力新玩法

中国上海&#xff0c;2023年11月14日 - 据希尔顿集团发布的《2024年趋势报告》显示&#xff0c;新一代亚洲旅行者正在崛起&#xff0c;也更重视高品质、个性化的服务。希尔顿集团紧随市场脉搏&#xff0c;在即将到来的冬季为宾客精心策划了一系列特色体验&#xff0c;凭借其遍布…

冰点还原精灵Deep Freeze for mac版

Deep Freeze是一种系统恢复软件&#xff0c;它可以保护计算机系统免受恶意软件和不必要的更改。它的基本功能是在计算机重启后恢复到原始状态&#xff0c;即使用户进行了任何更改也不例外。 Deep Freeze主要用于公共场所的计算机&#xff0c;如图书馆、学校实验室和互联网咖啡馆…

【电路笔记】-戴维南定理(Thevenin‘s Theorem)

戴维南定理&#xff08;Thevenin’s Theorem&#xff09; 文章目录 戴维南定理&#xff08;Thevenins Theorem&#xff09;1、概述与定义2、戴维南模型确定3、一些线性电路的戴维南模型3.1 单电压源3.2 单电流源3.3 多电流/电压源 4、结论 在本文中&#xff0c;我们将介绍一种强…