從零到掌握Spring Boot Validation 接口校驗的詳細過程
在開發(fā) Web 應用時,數(shù)據(jù)校驗是不可忽視的一部分。無論是注冊用戶信息、提交表單數(shù)據(jù),還是處理業(yè)務邏輯,數(shù)據(jù)的有效性和完整性都需要得到保證。Spring Boot 提供了強大的驗證功能,基于 Hibernate Validator 框架,通過注解方式簡化了數(shù)據(jù)校驗的實現(xiàn)。本文將詳細介紹 Spring Boot 的 Validation 接口校驗機制,包括其核心功能、常用注解、自定義校驗、以及實際應用場景。
1. 什么是 Spring Validation?
Spring Validation 是一個用于數(shù)據(jù)校驗的框架,它基于 JSR-303(Bean Validation API) 和 Hibernate Validator 實現(xiàn)。通過在 JavaBean 的字段上添加特定的注解,可以定義數(shù)據(jù)的校驗規(guī)則。Spring Boot 通過整合 Hibernate Validator,使得在 Web 應用中使用數(shù)據(jù)校驗變得更加簡單。
2. Spring Boot Validation 的核心功能
- 注解式校驗:通過注解定義數(shù)據(jù)校驗規(guī)則。
- 自動化校驗:Spring Boot 提供了對校驗的自動支持,無需手動編寫校驗邏輯。
- 異常處理:Spring Boot 可以自動將校驗失敗的錯誤信息返回給客戶端。
- 支持分組校驗:可以為不同的場景定義不同的校驗分組。
- 支持自定義校驗:可以擴展注解,定義自定義的校驗邏輯。
3. 常用的校驗注解
以下是 Spring Boot 中常用的校驗注解:
| 注解 | 功能描述 |
|---|---|
@NotNull | 確保字段不為 null |
@Null | 確保字段為 null |
@NotBlank | 確保字段不為空(字符串) |
@NotEmpty | 確保字段不為空(集合、數(shù)組) |
@Length | 確保字段的長度在指定范圍內 |
@Size | 確保字段的長度在指定范圍內(適用于集合、數(shù)組、字符串) |
@Range | 確保字段的值在指定范圍內 |
@Min | 確保字段的值大于等于指定值 |
@Max | 確保字段的值小于等于指定值 |
@Email | 確保字段為有效的電子郵件地址 |
@Pattern | 確保字段的值匹配指定的正則表達式 |
@Past | 確保字段的值是過去的日期 |
@Future | 確保字段的值是未來的日期 |
4. Spring Boot Validation 的實現(xiàn)步驟
步驟 1:添加依賴
在 pom.xml 文件中添加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>步驟 2:創(chuàng)建 JavaBean
創(chuàng)建一個需要校驗的 JavaBean 類,并在字段上添加校驗注解:
import jakarta.validation.constraints.*;
public class User {
@NotNull(message = "用戶名不能為空")
@Size(min = 2, max = 10, message = "用戶名長度必須在2到10之間")
private String username;
@NotNull(message = "密碼不能為空")
@NotBlank(message = "密碼不能為空")
@Pattern(regexp = "^(?=.*\\d)(?=.*[A-Za-z])(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,20}$", message = "密碼格式不正確")
private String password;
@Email(message = "郵箱格式不正確")
private String email;
@Min(value = 18, message = "年齡必須大于等于18歲")
private Integer age;
public User() {}
// Getters and Setters
}步驟 3:在控制器中使用 @Valid 注解
在控制器的參數(shù)中使用 @Valid 注解啟用校驗:
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
@RestController
public class UserController {
@PostMapping("/register")
public ResponseEntity<?> register(@Valid @RequestBody User user) {
// 業(yè)務邏輯
return ResponseEntity.ok("注冊成功");
}
}步驟 4:處理校驗異常
Spring Boot 會自動將校驗失敗的錯誤信息封裝到 MethodArgumentNotValidException 異常中??梢酝ㄟ^全局異常處理來統(tǒng)一返回錯誤信息:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}5. 自定義校驗注解
如果內置的校驗注解無法滿足需求,可以通過自定義注解來擴展校驗功能。
自定義校驗注解
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Constraint(validatedBy = {PhoneValidator.class})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {
String message() default "手機號格式不正確";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}自定義校驗邏輯
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class PhoneValidator implements ConstraintValidator<Phone, String> {
@Override
public void initialize(Phone constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
// 手機號正則表達式
String regex = "^1(3\\d|5[i-o]\\d|78\\d|4\\d)\\d{7}$";
return value.matches(regex);
}
}使用自定義校驗注解
@Phone(message = "手機號格式不正確") private String phone;
6. 分組校驗和條件校驗
分組校驗
通過分組校驗,可以為不同的場景定義不同的校驗規(guī)則。
public interface SaveGroup {
}
public interface UpdateGroup {
}
@NotNull(groups = SaveGroup.class)
@Size(min = 2, max = 10, groups = {SaveGroup.class, UpdateGroup.class})
private String username;在控制器中指定需要校驗的分組:
@PostMapping("/save")
public ResponseEntity<?> save(@Validated(SaveGroup.class) @RequestBody User user) {
// 業(yè)務邏輯
return ResponseEntity.ok("保存成功");
}條件校驗
通過 @ScriptAssert 注解,可以基于腳本語言(如 JavaScript 或 Groovy)實現(xiàn)復雜的條件校驗。
@ScriptAssert(lang = "javascript", script = "password.length >= 8 && password.match(/^(?=.*\\d)(?=.*[A-Za-z])(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,20}$/)")
public class User {
// 字段定義
}7. 結合其他技術
1. 統(tǒng)一異常處理
通過全局異常處理,可以統(tǒng)一返回校驗失敗的錯誤信息,提升用戶體驗。
2. 日志記錄
通過 AOP(Aspect Oriented Programming),可以記錄校驗失敗的日志,方便后續(xù)分析:
@Aspect
@Component
public class ValidationAspect {
@Around("execution(* *(..)) && @annotation(org.springframework.web.bind.annotation.PostMapping)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
try {
Object[] args = joinPoint.getArgs();
if (args != null && args.length > 0) {
for (Object arg : args) {
if (arg != null && arg.getClass().getAnnotation(Valid.class) != null) {
// 記錄日志
System.out.println("開始校驗數(shù)據(jù):" + arg);
}
}
}
return joinPoint.proceed();
} catch (MethodArgumentNotValidException ex) {
// 記錄校驗失敗的日志
System.out.println("校驗失敗:" + ex.getBindingResult());
throw ex;
}
}
}8. 常見問題和解決方案
常見問題
- 校驗注解不生效:
- 檢查是否添加了
spring-boot-starter-validation依賴。 - 確保在控制器中使用了
@Valid注解。
- 檢查是否添加了
- 錯誤信息不返回:
- 檢查是否實現(xiàn)了全局異常處理。
- 確保控制器的返回類型為
ResponseEntity。
- 自定義校驗注解不生效:
- 檢查自定義注解的
ConstraintValidator是否正確實現(xiàn)。 - 確保自定義注解使用了
@Constraint注解。
- 檢查自定義注解的
總結
Spring Boot 的 Validation 功能提供了一種簡單而強大的數(shù)據(jù)校驗方式,通過注解式校驗和自動化處理,能夠顯著提升開發(fā)效率和代碼質量。結合 Hibernate Validator 的強大功能,開發(fā)者可以輕松實現(xiàn)復雜的校驗邏輯,同時通過自定義校驗注解和分組校驗,滿足不同的業(yè)務需求。
希望本文能幫助你在實際項目中更好地使用 Spring Boot 的 Validation 功能,提高代碼的健壯性和用戶體驗!
到此這篇關于從零到掌握Spring Boot Validation 接口校驗的詳細過程的文章就介紹到這了,更多相關Spring Boot Validation 接口校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot + validation 接口參數(shù)校驗的思路詳解
- Spring?Boot集成validation實現(xiàn)參數(shù)校驗功能
- SpringBoot使用Validation包進行輸入?yún)?shù)校驗
- spring?boot?validation參數(shù)校驗與分組嵌套各種類型及使用小結
- springboot中使用Hibernate-Validation校驗參數(shù)詳解
- SpringBoot使用Validation進行參數(shù)校驗的示例詳解
- spring-boot-starter-validation?校驗參數(shù)的實現(xiàn)
- spring boot輸入數(shù)據(jù)校驗(validation)的實現(xiàn)過程
相關文章
微服務Spring?Boot?整合Redis?阻塞隊列實現(xiàn)異步秒殺下單思路詳解
這篇文章主要介紹了微服務Spring?Boot?整合Redis?阻塞隊列實現(xiàn)異步秒殺下單,使用阻塞隊列實現(xiàn)秒殺的優(yōu)化,采用異步秒殺完成下單的優(yōu)化,本文給大家分享詳細步驟及實現(xiàn)思路,需要的朋友可以參考下2022-10-10
SpringBoot教程_創(chuàng)建第一個SpringBoot項目
這篇文章主要介紹了SpringBoot教程_創(chuàng)建第一個SpringBoot項目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringCloud Feign Jackson自定義配置方式
這篇文章主要介紹了SpringCloud Feign Jackson自定義配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

