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 | 值必須為負(fù)數(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-06linux中nohup?java?-jar啟動java項目的步驟
nohup是一個Unix和Linux命令,用于運行關(guān)閉時不會被終止的進程,這篇文章主要給大家介紹了關(guān)于linux中nohup?java?-jar啟動java項目的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08Springboot遷移到Micronaut實現(xiàn)過程詳解
這篇文章主要為大家?介紹了Springboot遷移到Micronaut實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn)
這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java有趣好玩的圖形界面開發(fā)八個案例實現(xiàn)
今天使用GUI技術(shù)寫了幾個練習(xí)的Demo,希望對大家學(xué)習(xí)圖形用戶界面有所幫助,感興趣的同學(xué)來看看吧,動手敲一遍理解更通透2022-05-05Retrofit+RxJava實現(xiàn)帶進度條的文件下載
這篇文章主要為大家詳細介紹了Retrofit+RxJava實現(xiàn)帶進度條的文件下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06SpringCloud通過Feign傳遞List類型參數(shù)方式
這篇文章主要介紹了SpringCloud通過Feign傳遞List類型參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03