validation的简单使用

devtools/2024/9/25 7:26:14/

首先是依赖
我这里使用的是 web 工程,所以多一个web依赖

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

先尝试一下 项目是否都能跑起来

  1. 新建一个类,很简单对吧
java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {private String name;private Integer age;private String mobile;
}
  1. 然后我们的接口如下,也非常简单对吧
java">@RequestMapping("/validation")
@RestController
public class ValidationController {@PostMapping("/test")public String test(@RequestBody Student student) {System.out.println(student);return "test";}
}
  1. 使用postman请求一下
    在这里插入图片描述
  2. 查看结果
    在这里插入图片描述

ok,下面我们不使用 validation 来校验一下参数,一般我们这么写

java">    @PostMapping("/test2")public String test2(@RequestBody Student student) {if (student == null) {throw new RuntimeException("student is null");}if (null == student.getAge() ||!StringUtils.hasText(student.getName()) ||!StringUtils.hasText(student.getMobile())) {throw new RuntimeException("parmeter has null value");}if (student.getAge() < 0) {throw new RuntimeException("age is less than 0");}if (student.getMobile().length() != 11) {throw new RuntimeException("mobile length is not 11");}System.out.println(student);return "test";}

看着很麻烦,杂乱,即便是将其抽出去,单成一个方法,也只是眼不见心不烦而已。

下面我们使用 validation 来写

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {@NotBlank(message = "名字不能为空")private String name;@DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")@DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")private Integer age;private String mobile;
}
java">    @PostMapping("/test3")//注意看,这里也多了一个@Valid 注解public String test3(@RequestBody @Valid Student student) {System.out.println(student);return "test";}

我们请求一下:
在这里插入图片描述
请求失败,看一下控制台
在这里插入图片描述
虽然实现了,但是我们更希望 我们的报错信息能返回给前端,而不是输出在控制台。
所以我们还需要做一个异常全局捕获处理,我这里写一个简单的

java">/*异常全局处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public String exceptionHandler(Exception e) {return e.getMessage();}
}

这样之后,效果如下
在这里插入图片描述

下面我们编写一个自定义的 参数检验方法,就用于我们的 mobile 字段,就比如:必须 11位,并且是数字1开头,这个逻辑是现有的注解实现不了的,只能自己写

那么问题就是怎么写,我们找一个现成的 @NotNull复制一下,改改代码

java">@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {MobileValidator.class}//注意,这里是需要我们自己写的
)
public @interface Mobile {String message() default "手机号码有误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
java">public class MobileValidator implements ConstraintValidator<Mobile, String> {/*这两个泛型,前者是注解类型 ,后者是 要检验的值是什么类型*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {/*s就是前端传过来的值*/return StringUtils.hasText(s) && s.length() == 11 && s.startsWith("1");}
}

然后我们将自定义的 Mobile 用起来

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {@NotBlank(message = "名字不能为空")private String name;@DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")@DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")private Integer age;@Mobile//这里用起来private String mobile;
}

我们请求一下

在这里插入图片描述


http://www.ppmy.cn/devtools/35826.html

相关文章

Canal:MySQL Binlog解析与增量数据订阅实战指南

引言 在现代数据驱动的业务场景下&#xff0c;数据的实时性和一致性变得至关重要。阿里巴巴开源的Canal项目&#xff0c;作为一款强大的MySQL数据库增量日志解析工具&#xff0c;为数据订阅与消费提供了一站式的解决方案。本文将深入介绍Canal的基本概念、工作原理、特性优势以…

学生管理系统初级

根据题目要求生成大纲 总结: 1.在书写时&#xff0c;考虑到了书写时id可是是abc... 类型是String&#xff0c;但在根据id获取集合中元素时 list.get() &#xff0c;get&#xff08;&#xff09;里面是int类型。 2.在书写还有一点功能并不完全&#xff0c; 2.1查找时是打印所有…

【Git】回滚旧提交版本且不影响最新提交版本

【Git】回滚旧提交版本且不影响最新提交版本 一、场景假设 远程仓库origin中有一个分支main&#xff0c;有4次提交记录&#xff1a;v1、v2、v3、v4。 二、需求 需要回滚旧提交版本&#xff0c;但不影响已有的所有提交版本&#xff08;即不影响最新提交版本&#xff09;&…

JAVA基础jsp之session与Cookie对比,application

目录 session与Cookie对比 session和Cookie跨页面&#xff0c;application跨用户。 一、application对象 二、application对象常用的方法 三、案例演示 session与Cookie对比 相同点&#xff1a;①都是用来保持用户状态的一种机制②都会过期&#xff08;生存期限&#xff0…

水库大坝安全监测预警系统解决方案介绍

一、方案背景 随着社会的快速发展&#xff0c;水库大坝作为重要的水利工程设施&#xff0c;承载着防洪、灌溉、发电等多重功能。然而水库大坝的安全问题也日益凸显&#xff0c;一旦发生事故&#xff0c;后果将不堪设想&#xff0c;因此&#xff0c;建立一套高效、准确的水库大…

高防护皮带机巡检机器人:适应恶劣环境的智能助手

在众多工业领域中&#xff0c;皮带机作为一种重要的物料输送设备&#xff0c;广泛应用于发电厂、煤栈等场所。然而&#xff0c;长期以来&#xff0c;皮带机的巡检工作一直依赖人工&#xff0c;存在着劳动强度大、检测效率低、安全性差等问题。为了解决这些痛点&#xff0c;皮带…

【Web漏洞指南】XSS漏洞详细指南

【Web漏洞指南】XSS漏洞详细指南 概述XSS的三种类型执行任意 JS 代码的方式在原始HTML中注入绕过手法在 HTML标记内注入绕过手法在JavaScript代码中注入绕过手法其他绕过手法XSS常见有效载荷检索Cookies窃取页面内容键盘记录器查找内部IP地址端口扫描器自动填充密码捕获窃取 Po…

opencv t函数

在OpenCV中&#xff0c;t函数通常用于转置矩阵&#xff08;Transpose&#xff09;。这意味着矩阵的行和列互换位置。 在C中&#xff0c;使用OpenCV库进行矩阵转置的代码如下所示&#xff1a; #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创…