当前位置: 代码网 > it编程>编程语言>Java > Spring 中使用 Validation 注解校验参数的方法

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

2024年11月28日 Java 我要评论
spring 中使用 validation 注解校验参数在日常开发中,参数校验是一个常见需求,而 java 的 bean validation 提供了一种优雅的方式,通过注解对对象的字段进行校验。sp

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com