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 校验参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之Web服务器与Http详解

    Java基础之Web服务器与Http详解

    无论你是前端开发者还是后端开发者,以及测试工程师,这篇文章的知识都是你需要弄懂的。读完这一篇文章,将全面弄懂 HTTP 协议、TCP 协议,面试官再也难不倒你相关知识
    2021-09-09
  • Mybatis源码解析之初始化分析

    Mybatis源码解析之初始化分析

    这篇文章主要介绍了Mybatis源码解析之初始化分析,Mybatis的初始化过程就是mybatis配置文件的解析过程并将解析结果保存到Configuration类。,需要的朋友可以参考下
    2024-01-01
  • springboot 获取访问接口的请求的IP地址的实现

    springboot 获取访问接口的请求的IP地址的实现

    本文主要介绍了springboot获取访问接口的请求的IP地址的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot注册web组件的实现方式

    SpringBoot注册web组件的实现方式

    Servlet是Java Web应用程序的基础,它提供了处理客户端请求的机制,Servlet三大组件是指Servlet、Filter和Listener,它们是Java Web应用程序的核心组件,本文将给大家介绍一下SpringBoot注册web组件的实现方式,需要的朋友可以参考下
    2023-10-10
  • Spring Boot 对接深度求索接口实现知识问答功能

    Spring Boot 对接深度求索接口实现知识问答功能

    本文详细介绍了如何使用 Spring Boot 对接深度求索接口,实现知识问答功能,通过整合深度求索 API,我们可以轻松地在 Spring Boot 项目中实现智能问答功能,
    2025-02-02
  • SpringMVC JSON数据传输参数超详细讲解

    SpringMVC JSON数据传输参数超详细讲解

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器
    2023-02-02
  • SpringBoot打印启动时异常堆栈信息详解

    SpringBoot打印启动时异常堆栈信息详解

    在本篇文章里小编给大家整理的是关于SpringBoot打印启动时异常堆栈信息,有需要的朋友们可以学习下。
    2019-11-11
  • Java开发可离不开的@Mapper注解举例详解

    Java开发可离不开的@Mapper注解举例详解

    @Mapper 是 Mybatis 的注解,和Spring没有关系,这篇文章主要介绍了Java中@Mapper注解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-05-05
  • Java格式化类Format解读

    Java格式化类Format解读

    Java.text.Format 是 Java 格式化的抽象基类,用于将对象格式化为指定模式的字符串,或者将指定模式的字符串解析为对象,主要包含 format 和 parseObject 方法,分别用于格式化和解析
    2024-12-12
  • 使用Java实现在PDF插入页眉页脚

    使用Java实现在PDF插入页眉页脚

    在处理PDF文档时,有时需要为文档中的每一页添加页眉和页脚,这篇文章主要为大家详细介绍了如何使用Java为PDF文件添加页眉、页脚,感兴趣的可以了解下
    2024-03-03

最新评论