javax.validation.constraints如何校驗參數(shù)合法性
javax.validation.constraints校驗參數(shù)合法性
在Java開發(fā)過程中,數(shù)據(jù)校驗是一項至關(guān)重要的任務(wù)。
為了確保數(shù)據(jù)的完整性和正確性,我們通常需要對輸入的數(shù)據(jù)進(jìn)行一系列的校驗。
javax.validation.constraints提供了一套基于注解的校驗框架,能夠讓我們簡潔、高效地完成數(shù)據(jù)校驗工作。
基本用法:常用注解
javax.validation.constraints包含了一組基礎(chǔ)的校驗注解,覆蓋了大多數(shù)常見的數(shù)據(jù)校驗場景。
下面我們逐一介紹這些基本注解:
- @NotNull: 用于檢查值是否為null。
- @NotEmpty: 用于檢查字符串、集合、數(shù)組等類型是否為空或null。
- @Size: 用于檢查字符串、集合、數(shù)組等類型的元素個數(shù)是否在指定的范圍內(nèi)。
- @Min: 用于檢查數(shù)值是否大于等于指定的最小值。
- @Max: 用于檢查數(shù)值是否小于等于指定的最大值。
- @DecimalMin: 用于檢查數(shù)值是否大于等于指定的最小值(可以是浮點(diǎn)數(shù))。
- @DecimalMax: 用于檢查數(shù)值是否小于等于指定的最大值(可以是浮點(diǎn)數(shù))。
- @Digits: 用于檢查數(shù)值是否符合指定的整數(shù)位數(shù)和小數(shù)位數(shù)要求。
- @Email: 用于檢查字符串是否符合電子郵件格式。
- @Pattern: 用于檢查字符串是否符合指定的正則表達(dá)式。
以下是一個簡單的示例,展示了如何使用這些基本注解對一個用戶實(shí)體類進(jìn)行校驗:
import javax.validation.constraints.*;
public class User {
@NotNull(message = "ID 不能為空")
private Long id;
@NotEmpty(message = "用戶名不能為空")
@Size(min = 2, max = 20, message = "用戶名長度必須在 2 到 20 個字符之間")
private String username;
@Min(value = 18, message = "年齡必須大于等于 18 歲")
@Max(value = 100, message = "年齡必須小于等于 100 歲")
private int age;
@Email(message = "電子郵件格式不正確")
private String email;
// Getter and Setter ...
}高級應(yīng)用:自定義注解和校驗器
盡管javax.validation.constraints提供了豐富的基礎(chǔ)注解,但有時我們還需要進(jìn)行一些特定的校驗操作。這時,我們可以通過自定義注解和校驗器來實(shí)現(xiàn)這些需求。
以下是一個示例,展示了如何創(chuàng)建一個自定義注解@Password,用于檢查密碼是否符合強(qiáng)度要求(至少包含一個大寫字母、一個小寫字母和一個數(shù)字):
首先,創(chuàng)建自定義注解@Password:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = PasswordValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Password {
String message() default "密碼必須包含至少一個大寫字母、一個小寫字母和一個數(shù)字";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}然后,創(chuàng)建自定義校驗器PasswordValidator:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class PasswordValidator implements ConstraintValidator<Password, String> {
private static final String PASSWORD_PATTERN = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$";
@Override
public void initialize(Password constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
return value.matches(PASSWORD_PATTERN);
}
}最后,在需要校驗的字段上添加自定義注解@Password:
public class User {
// ... 其他字段
@Password
private String password;
// Getter and Setter ...
}整合Spring Boot
在Spring Boot項目中,我們可以很方便地整合javax.validation.constraints進(jìn)行數(shù)據(jù)校驗。
首先,需要在項目的pom.xml文件中添加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>然后,在Controller方法的參數(shù)前添加@Valid注解,即可觸發(fā)數(shù)據(jù)校驗。
當(dāng)校驗失敗時,Spring Boot會拋出MethodArgumentNotValidException異常。
我們可以通過定義全局異常處理器來捕獲該異常,并將校驗失敗的信息返回給客戶端:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException exception) {
StringBuilder message = new StringBuilder();
exception.getBindingResult().getFieldErrors().forEach(fieldError ->
message.append(fieldError.getField()).append(": ").append(fieldError.getDefaultMessage()).append("; ")
);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message.toString());
}
}總結(jié)
以上就是javax.validation.constraints的基本用法和高級應(yīng)用。
通過掌握這個強(qiáng)大的校驗框架,我們可以輕松地為Java項目實(shí)現(xiàn)數(shù)據(jù)校驗功能,從而提高代碼的健壯性和可維護(hù)性。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證
這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下2016-06-06
Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解
這篇文章主要為大家介紹了Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
JFrame中添加和設(shè)置JPanel的方法實(shí)例解析
這篇文章主要介紹了JFrame中添加和設(shè)置JPanel的方法實(shí)例解析,具有一定借鑒價值2018-01-01

