Spring 中使用 Validation 注解校验参数的方法

 更新时间:2024年11月27日 11:56:55   作者:进阶的菜狗  
本文介绍了如何在Spring中使用Validation注解进行参数校验,包括引入依赖、简单示例、常见校验注解分类与说明、分组校验和自定义校验,通过这些方法,可以方便地对Controller、Service等层面的参数进行校验,确保数据的合法性和一致性,感兴趣的朋友跟随小编一起看看吧

Spring 中使用 Validation 注解校验参数

在日常开发中,参数校验是一个常见需求,而 Java 的 Bean Validation 提供了一种优雅的方式,通过注解对对象的字段进行校验。Spring 对此功能进行了深度整合,使得在 Controller、Service 等层面实现校验变得非常简单。

本文将从以下几个方面介绍如何在 Spring 中使用 Validation 注解:

  • 引入依赖
  • 简单示例
  • 常见校验注解分类与说明
  • 分组校验
  • 自定义校验

1. 引入依赖

在使用 Spring 校验功能之前,需要引入相关依赖。
通常使用 Hibernate Validator 作为 JSR 380 的实现。

Maven

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

Gradle

implementation 'org.springframework.boot:spring-boot-starter-validation'

2. 简单示例

以下是一个基本的参数校验示例。我们通过 @NotNull, @Size 等注解对参数进行校验,并在校验失败时返回错误信息。

数据模型

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User {
    @NotNull(message = "用户名不能为空")
    @Size(min = 3, max = 15, message = "用户名长度必须在3到15个字符之间")
    private String username;
    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度至少为6个字符")
    private String password;
    // Getter & Setter
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Controller

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/users")
@Validated
public class UserController {
    @PostMapping("/register")
    public String register(@RequestBody @Valid User user) {
        return "用户注册成功:" + user.getUsername();
    }
}

测试

请求示例:

请求 Body

{
    "username": "john",
    "password": "123456"
}

响应成功

用户注册成功:john

错误请求 Body

{
    "username": "jo",
    "password": ""
}

响应失败

{
    "timestamp": "2024-11-18T12:34:56.789",
    "status": 400,
    "error": "Bad Request",
    "message": "用户名长度必须在3到15个字符之间; 密码不能为空"
}

3. 常见校验注解分类与说明

通用校验

注解功能说明示例
@NotNull字段不能为空@NotNull(message="必填")
@NotBlank字符串非空且非空白@NotBlank(message="必填")
@NotEmpty集合或数组不能为空@NotEmpty
@Size字符串、集合长度校验@Size(min=1, max=10)

数值校验

注解功能说明示例
@Min值必须大于等于指定值@Min(18)
@Max值必须小于等于指定值@Max(100)
@Positive值必须为正数@Positive
@PositiveOrZero值必须为正数或零@PositiveOrZero
@Negative值必须为负数@Negative

字符串校验

注解功能说明示例
@Email必须是合法邮箱地址@Email(message="邮箱格式错误")
@Pattern必须匹配正则表达式@Pattern(regexp="\\d{3}-\\d{3}")

日期校验

注解功能说明示例
@Past必须是过去的日期@Past
@Future必须是将来的日期@Future
@PastOrPresent必须是过去或当前日期@PastOrPresent
@FutureOrPresent必须是将来或当前日期@FutureOrPresent

Validation关于直接对JSON的日期格式进行校验,需要使用正则表达式 @Pattern(regexp = “”)或者自定义注解,建议直接使用Jackson的@JsonFormat。

4. 分组校验

在实际项目中,不同场景可能需要不同的校验规则,例如新增和更新时字段要求可能不同。可以通过 分组校验 实现。

分组接口

public class Group{
public interface CreateGroup {}
public interface UpdateGroup {}
}

数据模型

import javax.validation.constraints.*;
public class User {
    @NotNull(message = "用户ID不能为空", groups = Group.UpdateGroup.class)
    private Long id;
    @NotBlank(message = "用户名不能为空", groups = Group.CreateGroup.class)
    private String username;
    @NotBlank(message = "密码不能为空", groups = GroupCreateGroup.class)
    private String password;
    // Getter & Setter
}

Controller

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
@Validated
public class UserController {
    @PostMapping("/create")
    public String create(@RequestBody @Validated(CreateGroup.class) User user) {
        return "创建成功:" + user.getUsername();
    }
    @PostMapping("/update")
    public String update(@RequestBody @Validated(UpdateGroup.class) User user) {
        return "更新成功:" + user.getId();
    }
}

5. 自定义校验

当现有的注解无法满足需求时,可以自定义校验注解。

自定义注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = UsernameValidator.class) // 关联校验器
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidUsername {
    String message() default "用户名非法";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

自定义校验器

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.matches("^[a-zA-Z0-9]+$");
    }
}

使用自定义注解

public class User {
    @ValidUsername
    private String username;
    // Getter & Setter
}

到此这篇关于Spring 中使用 Validation 注解校验参数的文章就介绍到这了,更多相关Spring Validation 校验参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中的内容协商器图解

    SpringBoot中的内容协商器图解

    本文通过图文解说加代码的形式给大家介绍了SpringBoot中的内容协商器知识,需要的朋友参考下吧
    2017-11-11
  • Mybatis查询数据的项目实现

    Mybatis查询数据的项目实现

    MyBatis通过XML配置文件或注解,把Java对象映射到对应的数据库表中,实现对象关系和数据关系的互相转换,从而使得Java应用程序能够更简单的操作和读取数据库,本文就详细的介绍一下如何实现,感兴趣的可以了解一下
    2023-09-09
  • Java解析Excel文件并把数据存入数据库

    Java解析Excel文件并把数据存入数据库

    本篇文章主要介绍了Java解析Excel文件并把数据存入数据库 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • "Method Not Allowed"405问题分析以及解决方法

    "Method Not Allowed"405问题分析以及解决方法

    项目中在提交表单时,提示“HTTP 405”错误——“Method Not Allowed”这里显示的是,方法不被允许,下面这篇文章主要给大家介绍了关于"Method Not Allowed"405问题分析以及解决方法的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java Stream reduce()使用指南

    Java Stream reduce()使用指南

    reduce()是Java Stream API中的一个重要终端操作,用于将流中的元素通过二元运算符结合起来,生成单一结果,它主要用于计算总和、乘积、最大值、最小值和字符串连接等,本文给大家介绍Java Stream reduce(),感兴趣的朋友一起看看吧
    2024-10-10
  • idea快速找到项目中对应的类图文详解(包括源码)

    idea快速找到项目中对应的类图文详解(包括源码)

    用IDEA开发Java项目时经常会使用到各种快捷键,其中搜索是最常用的之一,下面这篇文章主要给大家介绍了关于idea如何快速找到项目中对应的类(包括源码)的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • java中xml进行报文发送和解析操作

    java中xml进行报文发送和解析操作

    这篇文章主要介绍了java中xml进行报文发送和解析操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java关键字详解之final static this super的用法

    Java关键字详解之final static this super的用法

    this用来调用目前类自身的成员变量,super多用来调用父类的成员,final多用来定义常量用的,static定义静态变量方法用的,静态变量方法只能被类本身调用,下文将详细介绍,需要的朋友可以参考下
    2021-10-10
  • java 中归并排序算法详解

    java 中归并排序算法详解

    这篇文章主要介绍了java 中归并排序算法详解的相关资料,归并排序算法又称为合并排序算法,是一种时间复杂度为O(N logN)的排序算法,因而其在平常生活工作中应用非常广泛,需要的朋友可以参考下
    2017-09-09
  • 获取Java加载器和类完整结构的方法分享

    获取Java加载器和类完整结构的方法分享

    这篇文章主要为大家详细介绍了获取Java加载器和类完整结构的方法,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-12-12

最新评论