spring 参数校验Validation示例详解

2024-12-31 03:50

本文主要是介绍spring 参数校验Validation示例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详...

前言

在实际开发中,我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递,传来的参数长度不符合要求等,这种时候如果放任不管,继续执行后续业务逻辑,很有可能就会出现意想不到的bug。

有人可能会说,这不是前端的问题吗,让前端校验去。话是这么说,但我们也不能前端校验百分百不会出现问题。并且有些请求可能也不是正规通过客户端发来的,可能是黑客恶意攻击,又或是通过Postman等发来的,这些请求就不一定会“合法”了。

因此,对客户端传来的每个请求都进行必要的参数校验是十分重要的。而很多简单的校验如果都需要程序员自己去写的话,就会导致代码过于冗长、繁琐。为了让校验更加简洁明了,Spring为我们提供了Validation工具类来提供各种校验方法。

一、Validation常见的校验注解

空校验注解

  • @Null:被注释的元素必须为null
  • @NotNull:被注释的元素必须不为null
  • @NotBlank:被注释的字符串去掉前后空格后长度必须非零。
  • @NotEmpty:被注释的字符串、集合或数组不能为空(字符串长度非零、集合大小非零)。

布尔校验注解

  • @AssertTrue:被注释的元素必须为true
  • @AssertFalse:被注释的元素必须为false

日期校验注解

  • @Past:被注释的元素必须是一个过去的日期。
  • @Future:被注释的元素必须是一个将来的日期。

数字校验注解

  • @Min(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
  • @Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
  • @DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
  • @DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等python于指定的最大值。

长度校验注解

  • @Size(max, min):被注释的元素(如字符串、集合、数组)的大小必须在指定的范围内。

模式匹配校验注解

  • @Pattern(regexp):被注释的元素必须符合指定的正则表达式

邮箱校验注解

  • @Email:被注释的元素必须是电子邮箱地址。

范围校验注解

  • @Range(min, max):被注释的元素必须在合适的范围内。

二、Validation的简单应用

首先我们需要导入Validation的依赖:

<!--validation依赖,负责参数校验-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

接着在需要使用校验的类上添加@Validation注解

spring 参数校验Validation示例详解

接着主要有两种方式使用校验注解:

1、直接在对应参数上加上注解

@RestController
@RequestMapping("/user")
@Validation
public class UserController {
    @RequestMapping("/login")
    public Result login(@Size(max = 12,min = 4) String username, @Pattern(regexp = "^\\S{5,16}$") Strin编程g password){
        //登录
        return Result.success();
    }
}

2、实体类添加校验

对于一些实体类来说,直接在参数上加注解就不太可取了,程序会无法定位到指定参数。

需要再实体类内部对应的变量上添加注解:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {
    @NotNull
    private Integer id;//主键ID
    @NotEmpty
    privatjse String categoryName;//分类名称
    @NotEmpty
    private String categoryAlias;//分类别名
    private Integer createUser;//创建人ID
    @jsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//更新时间
}

接着在使用实体类的地方加上 @Validated 注解,就能让这些校验生效了:

@PutMapping("/update")
    public Result update(@RequestBody @Validated User user){
        //业务逻辑
        return Result.success();
    }

三、分组校验

前面我们介绍了如何在实体类中添加校验注解。但是,事实上在实现不同功能时,对同一个实体类的校验规则可能是会有差异的。

比如在添加用户的场景下,用户的id值就是在存入数据库后生成的,在参数传递时自然就不是必传项;而在更新用户的场景下,我们需要通过id定位指定用户,完成信息更新操作,这时在参数传递时id就是必传项了。

这样,对id值的校验就会产生冲突了。如果将pythonid设定为必传值,那么就会导致添加用户的操作可能出现错误。不把id设定为必传值,更新用户的操作又会出现错误。

为了应对这一问题,就可以对校验项进行分组归类。具体操作步骤如下:

在实体类内部定义相应组别接口:

public class User {
    //各成员变量
    //添加用户类分组
    public interface Add extends Default {
    }
    //更新用户类分组
  China编程  public interface Update extends Default{
    }
}

注意:如果没有手动对校验项进行分组,其默认就在 Default

对校验项进行分组,只需要通过groups属性指定组别即可:

@NotNull(groups = Update.class)

接着在校验时指定对应的分组即可:

@PutMapping
public Result update(@RequestBody @Validated(User.Update.class) User user){
    //业务逻辑
    return Result.success();
}
@PostMapping
public Result add(@RequestBody @Validated(User.Add.class) User user){
    //业务逻辑
    return Result.success();
}

这样就能实现不同业务场景下的多样化校验了。 

四、自定义校验

实际开发中的校验规则可能是五花八门的,但官方提供的校验注解就这么多,很多时候并不能满足我们的校验需求。这时候就需要通过自定义校验注解来实现个性化的校验了。

首先需要定义一个注解:

@Documented //元注解
@Target(ElementType.FIELD) //元注解
@Retention(RetentionPolicy.RUNTIME) //元注解
@Constraint(validatedBy = {/*校验规则*/}) //自定义校验规则
public @interface State {
    //提供校验失败后的提示信息
    String message() default "state参数的值只能是已发布或草稿";
    //指定分组
    Class<?>[] groups() default {};
    //负载  获取到State注解的附加信息
    Class<? extends Payload>[] payload() default {};
}

接着定义一个类去实现 ConstraintValidator 接口,并实现 isValid 方法:

public class StateValidation implements ConstraintValidator<State,String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        //返回true表示校验通过,返回false则表示校验不通过
        if(value==null) return false;
        if(value.equals("已发布")||value.equals("草稿"))return true;
        return false;
    }
}

然后就要在之前定义的注解中的@Constraint中填入自定义类:

 @Constraint(validatedBy = {StateValidation.class}) //自定义校验规则

spring 参数校验Validation示例详解

接着就可以像使用其它校验注解一样来使用自己自定义的注解了:

spring 参数校验Validation示例详解

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

到此这篇关于spring 参数校验Validation的文章就介绍到这了,更多相关spring 参数校验Validation内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于spring 参数校验Validation示例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152864

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2