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