Spring?中使用?Validation?注解校驗參數(shù)的方法
Spring 中使用 Validation 注解校驗參數(shù)
在日常開發(fā)中,參數(shù)校驗是一個常見需求,而 Java 的 Bean Validation 提供了一種優(yōu)雅的方式,通過注解對對象的字段進行校驗。Spring 對此功能進行了深度整合,使得在 Controller、Service 等層面實現(xiàn)校驗變得非常簡單。
本文將從以下幾個方面介紹如何在 Spring 中使用 Validation 注解:
- 引入依賴
- 簡單示例
- 常見校驗注解分類與說明
- 分組校驗
- 自定義校驗
1. 引入依賴
在使用 Spring 校驗功能之前,需要引入相關(guān)依賴。
通常使用 Hibernate Validator 作為 JSR 380 的實現(xiàn)。
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>Gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 簡單示例
以下是一個基本的參數(shù)校驗示例。我們通過 @NotNull, @Size 等注解對參數(shù)進行校驗,并在校驗失敗時返回錯誤信息。
數(shù)據(jù)模型
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"
}響應(yīng)成功
用戶注冊成功:john
錯誤請求 Body
{
"username": "jo",
"password": ""
}響應(yīng)失敗
{
"timestamp": "2024-11-18T12:34:56.789",
"status": 400,
"error": "Bad Request",
"message": "用戶名長度必須在3到15個字符之間; 密碼不能為空"
}3. 常見校驗注解分類與說明
通用校驗
| 注解 | 功能說明 | 示例 |
|---|---|---|
@NotNull | 字段不能為空 | @NotNull(message="必填") |
@NotBlank | 字符串非空且非空白 | @NotBlank(message="必填") |
@NotEmpty | 集合或數(shù)組不能為空 | @NotEmpty |
@Size | 字符串、集合長度校驗 | @Size(min=1, max=10) |
數(shù)值校驗
| 注解 | 功能說明 | 示例 |
|---|---|---|
@Min | 值必須大于等于指定值 | @Min(18) |
@Max | 值必須小于等于指定值 | @Max(100) |
@Positive | 值必須為正數(shù) | @Positive |
@PositiveOrZero | 值必須為正數(shù)或零 | @PositiveOrZero |
@Negative | 值必須為負數(shù) | @Negative |
字符串校驗
| 注解 | 功能說明 | 示例 |
|---|---|---|
@Email | 必須是合法郵箱地址 | @Email(message="郵箱格式錯誤") |
@Pattern | 必須匹配正則表達式 | @Pattern(regexp="\\d{3}-\\d{3}") |
日期校驗
| 注解 | 功能說明 | 示例 |
|---|---|---|
@Past | 必須是過去的日期 | @Past |
@Future | 必須是將來的日期 | @Future |
@PastOrPresent | 必須是過去或當(dāng)前日期 | @PastOrPresent |
@FutureOrPresent | 必須是將來或當(dāng)前日期 | @FutureOrPresent |
Validation關(guān)于直接對JSON的日期格式進行校驗,需要使用正則表達式 @Pattern(regexp = “”)或者自定義注解,建議直接使用Jackson的@JsonFormat。
4. 分組校驗
在實際項目中,不同場景可能需要不同的校驗規(guī)則,例如新增和更新時字段要求可能不同。可以通過 分組校驗 實現(xiàn)。
分組接口
public class Group{
public interface CreateGroup {}
public interface UpdateGroup {}
}數(shù)據(jù)模型
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 "創(chuàng)建成功:" + user.getUsername();
}
@PostMapping("/update")
public String update(@RequestBody @Validated(UpdateGroup.class) User user) {
return "更新成功:" + user.getId();
}
}5. 自定義校驗
當(dāng)現(xiàn)有的注解無法滿足需求時,可以自定義校驗注解。
自定義注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = UsernameValidator.class) // 關(guān)聯(lián)校驗器
@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
}到此這篇關(guān)于Spring 中使用 Validation 注解校驗參數(shù)的文章就介紹到這了,更多相關(guān)Spring Validation 校驗參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java concurrency線程池之Callable和Future_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了Java concurrency線程池之Callable和Future,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
linux中nohup?java?-jar啟動java項目的步驟
nohup是一個Unix和Linux命令,用于運行關(guān)閉時不會被終止的進程,這篇文章主要給大家介紹了關(guān)于linux中nohup?java?-jar啟動java項目的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
Springboot遷移到Micronaut實現(xiàn)過程詳解
這篇文章主要為大家?介紹了Springboot遷移到Micronaut實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn)
這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java有趣好玩的圖形界面開發(fā)八個案例實現(xiàn)
今天使用GUI技術(shù)寫了幾個練習(xí)的Demo,希望對大家學(xué)習(xí)圖形用戶界面有所幫助,感興趣的同學(xué)來看看吧,動手敲一遍理解更通透2022-05-05
Retrofit+RxJava實現(xiàn)帶進度條的文件下載
這篇文章主要為大家詳細介紹了Retrofit+RxJava實現(xiàn)帶進度條的文件下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
SpringCloud通過Feign傳遞List類型參數(shù)方式
這篇文章主要介紹了SpringCloud通過Feign傳遞List類型參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

