SpringBoot自定义参数校验注解

1.引入依赖,spring validation是在hibernate-validator上做了一层封装

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

2.定义参数校验注解与处理器

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Constraint(validatedBy = OrderCountValidator.class)
public @interface OrderCountValid {String message() default "订单数量超出库存";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class OrderCountValidator implements ConstraintValidator<OrderCountValid , Integer> {//可以注入mapper、service进来@Autowiredprivate OrderService orderService;@Overridepublic boolean isValid(Integer buyCount, ConstraintValidatorContext context) {return orderService.OrderCountValid(buyCount);}
}
public class Order implements Serializable {//购买数量@OrderCount(message = "购买数量不能超出库存")@NotNull(message = "购买数量不能为空")private Integer buyCount;//订单编号private String orderCode;
}

3.控制器层

@RestController
@RequestMapping(value = "/order")
public class OrderController {@PostMapping("/placeOrder")public String placeOrder(@RequestBody @Valid Order order){return "success";}
}

4.全局异常处理器,自定义校验注解校验失败会抛出 javax.validation.ConstraintViolationException

import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;@RestControllerAdvice
@Component
public class GlobalExceptionHandler {// 当直接校验具体参数时会出现javax.validation.ConstraintViolationException@ExceptionHandler(value = ConstraintViolationException.class)public String handleException1(ConstraintViolationException e) {// 拼接参数String errorMsg = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(", "));return errorMsg;}// 当直接校验具体参数时会出现org.springframework.web.bind@ExceptionHandler(value = MethodArgumentNotValidException.class)public String handleException2(MethodArgumentNotValidException e) {BindingResult exceptions = e.getBindingResult();// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息if (exceptions.hasErrors()) {// 这里默认错误消息return exceptions.getFieldError().getDefaultMessage();}return "请求参数错误";}
}

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

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

相关文章

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库,k8s)

一&#xff1a;安装docker。&#xff08;所有服务器都要安装&#xff09; 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…

如何通过SK集成chatGPT实现DotNet项目工程化?

智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么&#xff1f; Semantic Kernel是一个SDK&#xff0c;它将OpenAI、Azure OpenAI和Hugging Face等大…

Hadoop3教程(二十一):MapReduce中的压缩

文章目录 &#xff08;123&#xff09;压缩概述在Map阶段启用在Reduce阶段启用 &#xff08;124&#xff09;压缩案例实操如何在Map输出端启用压缩如何在Reduce端启用压缩 参考文献 &#xff08;123&#xff09;压缩概述 压缩也是MR中比较重要的一环&#xff0c;其可以应用于M…

golang 图像验证码

为什么base64图片 for RESTful 服务 Data URIs 支持大部分浏览器,IE8之后也支持.小图片使用base64响应对于RESTful服务来说更便捷安装golang包 go get -u github.com/mojocn/base64Captcha对于中国大陆Gopher go get golang.org/x/image 失败解决方案: mkdir -p $GOPATH/src/g…

【C++ Primer Plus学习记录】复合类型总结

数组、结构和指针是C的3种复合类型。 数组可以在一个数据对象中存储多个同种类型的值。通过索引或者下标&#xff0c;可以访问数组中各个元素。 结构可以将多个不同类型的值存储在同一个数据对象中&#xff0c;可以使用成员运算符&#xff08;.&#xff09;来访问其中的成员。…

虚拟音频设备软件 Loopback mac中文版软件介绍

创建虚拟音频设备以从应用程序和音频输入设备获取声音&#xff0c;然后将其发送到音频处理应用程序&#xff0c;它就是—Loopback for Mac&#xff0c;Loopback mac为您提供高端工作室混音板的强大功能&#xff0c;有了它在Mac上传递音频会变得很容易。 Loopback for mac中文版…

Flink之窗口触发机制及自定义Trigger的使用

1 窗口触发机制 窗口计算的触发机制都是由Trigger类决定的,Flink中为各类内置的WindowsAssigner都设计了对应的默认Trigger. 层次结构如下: Trigger ProcessingTimeoutTriggerEventTimeTriggerCountTriggerDeltaTriggerNeverTrigger in GlobalWindowsContinuousEventTimeTrigge…

LuatOS-SOC接口文档(air780E)-- ir - 红外遥控

ir.sendNEC(pin, addr, cmd, repeat, disablePWM)# 发送NEC数据 参数 传入值类型 解释 int 使用的GPIO引脚编号 int 用户码&#xff08;大于0xff则采用Extended NEC模式&#xff09; int 数据码 int 可选&#xff0c;引导码发送次数&#xff08;110ms一次&#xff0…

Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 getter 函…

Swift使用Embassy库进行数据采集:热点新闻自动生成器

概述 爬虫程序是一种可以自动从网页上抓取数据的软件。爬虫程序可以用于各种目的&#xff0c;例如搜索引擎、数据分析、内容聚合等。本文将介绍如何使用Swift语言和Embassy库编写一个简单的爬虫程序&#xff0c;该程序可以从新闻网站上采集热点信息&#xff0c;并生成一个简单…

GCC优化相关

文章目录 优化选项博文链接 单独设置某段代码优化等级博文链接 优化选项 -O/-O0:无优化(默认)-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1 下&#xff0c;编译会尝试减少代码体积和代码…

Sarscape5.6版本中导入外部控制点、写入精密轨道文件与GACOS用于大气相位

SARscape中导入外部GCP点用于轨道精炼 https://www.cnblogs.com/enviidl/p/16524645.html在SAR处理时&#xff0c;有时会加入GCP点文件&#xff0c;SAR处理中用到的控制点分为两类&#xff1a;用于校正地理位置的几何控制点&#xff08;Geometry GCP&#xff09;和用于轨道精炼…

多测师肖sir_高级金牌讲师___ui自动化之selenium001

一、认识selenium &#xff08;1&#xff09;selenium是什么&#xff1f; a、selenium是python中的一个第三方库 b、Selenium是一个应用于web应用程序的测试工具&#xff0c;支持多平台&#xff0c;多浏览器&#xff0c;多语言去实现ui自动化测试&#xff0c;我们现在讲的Sel…

Atlassian Confluence OGNL表达式注入RCE CVE-2021-26084

影响版本 All 4.x.x versions All 5.x.x versions All 6.0.x versions All 6.1.x versions All 6.2.x versions All 6.3.x versions All 6.4.x versions All 6.5.x versions All 6.6.x versions All 6.7.x versions All 6.8.x versions All 6.9.x versions All 6.1…

Android之播放本地视频和Url视频方法

一、播放本地视频文件 根据文件路径在浏览器中播放&#xff0c;可用于视频预览等场景 效果&#xff1a; 用浏览器播放本地视频 文件路径例子&#xff1a; /storage/emulated/0/Android/data/com.custom.jfrb/files/Movies/1697687179497.mp4 File file new File("文件…

RK3568笔记四:基于TensorFlow花卉图像分类部署

若该文为原创文章&#xff0c;转载请注明原文出处。 基于正点原子的ATK-DLRK3568部署测试。 花卉图像分类任务&#xff0c;使用使用 tf.keras.Sequential 模型&#xff0c;简单构建模型&#xff0c;然后转换成 RKNN 模型部署到ATK-DLRK3568板子上。 在 PC 使用 Windows 系统…

使用telegram机器人发送通知

文章目录 背景1 创建机器人2 与机器人的会话3 调用API让机器人发送消息 背景 在训练深度学习模型时&#xff0c;除了粗略估计外&#xff0c;很难预测训练何时结束。此外&#xff0c;我们可能还想随时随地查看训练情况&#xff0c;如果每次都需要登录回服务器的话并不方便。因此…

Kubernetes与Docker和Containerd是个什么关系

文章目录 小结描述实例参考 小结 Kubernetes 在不停地迭代演进&#xff0c;Kubernetes停止使用Docker做为Container Runtime&#xff0c;改为Containerd或者CRI-O等与与Container Runtime Interface (CRI)更兼容的Container Runtime&#xff0c;进行了小结。 容器组&#xff…

wordpress网站部署了ssl证书之后就排版混乱了

刚给自己的小网站部署了SSL证书&#xff0c;之后就发现https访问主页竟然乱套了。在手机上访问却是正常的。 直接上解决方案&#xff1a; 编辑网站根目录下的wp-config.php文件 在自定义文本处添加以下代码&#xff1a; if ($_SERVER[HTTP_X_FORWARDED_PROTO] https) $_SE…

PHP-FFMpeg 操作音视频

✨ 目录 &#x1f388; 安装PHP-FFMpeg&#x1f388; 视频中提取一张图片&#x1f388; 视频中提取多张图片&#x1f388; 调整视频大小&#x1f388; 视频添加水印&#x1f388; 生成音频波形&#x1f388; 音频转换&#x1f388; 给音频添加元数据&#x1f388; 拼接多个音视…