最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零到掌握Spring Boot Validation 接口校驗(yàn)的詳細(xì)過(guò)程

 更新時(shí)間:2025年02月25日 15:54:51   作者:庫(kù)庫(kù)林_沙琪馬  
本文詳細(xì)介紹了SpringBoot的Validation接口校驗(yàn)機(jī)制,包括其核心功能、常用注解、自定義校驗(yàn)、以及實(shí)際應(yīng)用場(chǎng)景,通過(guò)注解定義數(shù)據(jù)校驗(yàn)規(guī)則,感興趣的朋友跟隨小編一起看看吧

在開發(fā) Web 應(yīng)用時(shí),數(shù)據(jù)校驗(yàn)是不可忽視的一部分。無(wú)論是注冊(cè)用戶信息、提交表單數(shù)據(jù),還是處理業(yè)務(wù)邏輯,數(shù)據(jù)的有效性和完整性都需要得到保證。Spring Boot 提供了強(qiáng)大的驗(yàn)證功能,基于 Hibernate Validator 框架,通過(guò)注解方式簡(jiǎn)化了數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)。本文將詳細(xì)介紹 Spring Boot 的 Validation 接口校驗(yàn)機(jī)制,包括其核心功能、常用注解、自定義校驗(yàn)、以及實(shí)際應(yīng)用場(chǎng)景。

1. 什么是 Spring Validation?

Spring Validation 是一個(gè)用于數(shù)據(jù)校驗(yàn)的框架,它基于 JSR-303(Bean Validation API) 和 Hibernate Validator 實(shí)現(xiàn)。通過(guò)在 JavaBean 的字段上添加特定的注解,可以定義數(shù)據(jù)的校驗(yàn)規(guī)則。Spring Boot 通過(guò)整合 Hibernate Validator,使得在 Web 應(yīng)用中使用數(shù)據(jù)校驗(yàn)變得更加簡(jiǎn)單。

2. Spring Boot Validation 的核心功能

  • 注解式校驗(yàn):通過(guò)注解定義數(shù)據(jù)校驗(yàn)規(guī)則。
  • 自動(dòng)化校驗(yàn):Spring Boot 提供了對(duì)校驗(yàn)的自動(dòng)支持,無(wú)需手動(dòng)編寫校驗(yàn)邏輯。
  • 異常處理:Spring Boot 可以自動(dòng)將校驗(yàn)失敗的錯(cuò)誤信息返回給客戶端。
  • 支持分組校驗(yàn):可以為不同的場(chǎng)景定義不同的校驗(yàn)分組。
  • 支持自定義校驗(yàn):可以擴(kuò)展注解,定義自定義的校驗(yàn)邏輯。

3. 常用的校驗(yàn)注解

以下是 Spring Boot 中常用的校驗(yàn)注解:

注解功能描述
@NotNull確保字段不為 null
@Null確保字段為 null
@NotBlank確保字段不為空(字符串)
@NotEmpty確保字段不為空(集合、數(shù)組)
@Length確保字段的長(zhǎng)度在指定范圍內(nèi)
@Size確保字段的長(zhǎng)度在指定范圍內(nèi)(適用于集合、數(shù)組、字符串)
@Range確保字段的值在指定范圍內(nèi)
@Min確保字段的值大于等于指定值
@Max確保字段的值小于等于指定值
@Email確保字段為有效的電子郵件地址
@Pattern確保字段的值匹配指定的正則表達(dá)式
@Past確保字段的值是過(guò)去的日期
@Future確保字段的值是未來(lái)的日期

4. Spring Boot Validation 的實(shí)現(xiàn)步驟

步驟 1:添加依賴

在 pom.xml 文件中添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

步驟 2:創(chuàng)建 JavaBean

創(chuàng)建一個(gè)需要校驗(yàn)的 JavaBean 類,并在字段上添加校驗(yàn)注解:

import jakarta.validation.constraints.*;
public class User {
    @NotNull(message = "用戶名不能為空")
    @Size(min = 2, max = 10, message = "用戶名長(zhǎng)度必須在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 注解啟用校驗(yàn):

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è)務(wù)邏輯
        return ResponseEntity.ok("注冊(cè)成功");
    }
}

步驟 4:處理校驗(yàn)異常

Spring Boot 會(huì)自動(dòng)將校驗(yàn)失敗的錯(cuò)誤信息封裝到 MethodArgumentNotValidException 異常中。可以通過(guò)全局異常處理來(lái)統(tǒng)一返回錯(cuò)誤信息:

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. 自定義校驗(yàn)注解

如果內(nèi)置的校驗(yàn)注解無(wú)法滿足需求,可以通過(guò)自定義注解來(lái)擴(kuò)展校驗(yàn)功能。

自定義校驗(yàn)注解

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 "手機(jī)號(hào)格式不正確";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

自定義校驗(yàn)邏輯

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;
        }
        // 手機(jī)號(hào)正則表達(dá)式
        String regex = "^1(3\\d|5[i-o]\\d|78\\d|4\\d)\\d{7}$";
        return value.matches(regex);
    }
}

使用自定義校驗(yàn)注解

@Phone(message = "手機(jī)號(hào)格式不正確")
private String phone;

6. 分組校驗(yàn)和條件校驗(yàn)

分組校驗(yàn)

通過(guò)分組校驗(yàn),可以為不同的場(chǎng)景定義不同的校驗(yàn)規(guī)則。

public interface SaveGroup {
}
public interface UpdateGroup {
}
@NotNull(groups = SaveGroup.class)
@Size(min = 2, max = 10, groups = {SaveGroup.class, UpdateGroup.class})
private String username;

在控制器中指定需要校驗(yàn)的分組:

@PostMapping("/save")
public ResponseEntity<?> save(@Validated(SaveGroup.class) @RequestBody User user) {
    // 業(yè)務(wù)邏輯
    return ResponseEntity.ok("保存成功");
}

條件校驗(yàn)

通過(guò) @ScriptAssert 注解,可以基于腳本語(yǔ)言(如 JavaScript 或 Groovy)實(shí)現(xiàn)復(fù)雜的條件校驗(yàn)。

@ScriptAssert(lang = "javascript", script = "password.length >= 8 && password.match(/^(?=.*\\d)(?=.*[A-Za-z])(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,20}$/)")
public class User {
    // 字段定義
}

7. 結(jié)合其他技術(shù)

1. 統(tǒng)一異常處理

通過(guò)全局異常處理,可以統(tǒng)一返回校驗(yàn)失敗的錯(cuò)誤信息,提升用戶體驗(yàn)。

2. 日志記錄

通過(guò) AOP(Aspect Oriented Programming),可以記錄校驗(yàn)失敗的日志,方便后續(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("開始校驗(yàn)數(shù)據(jù):" + arg);
                    }
                }
            }
            return joinPoint.proceed();
        } catch (MethodArgumentNotValidException ex) {
            // 記錄校驗(yàn)失敗的日志
            System.out.println("校驗(yàn)失敗:" + ex.getBindingResult());
            throw ex;
        }
    }
}

8. 常見問(wèn)題和解決方案

常見問(wèn)題

  • 校驗(yàn)注解不生效
    • 檢查是否添加了 spring-boot-starter-validation 依賴。
    • 確保在控制器中使用了 @Valid 注解。
  • 錯(cuò)誤信息不返回
    • 檢查是否實(shí)現(xiàn)了全局異常處理。
    • 確??刂破鞯姆祷仡愋蜑?nbsp;ResponseEntity
  • 自定義校驗(yàn)注解不生效
    • 檢查自定義注解的 ConstraintValidator 是否正確實(shí)現(xiàn)。
    • 確保自定義注解使用了 @Constraint 注解。

總結(jié)

Spring Boot 的 Validation 功能提供了一種簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)校驗(yàn)方式,通過(guò)注解式校驗(yàn)和自動(dòng)化處理,能夠顯著提升開發(fā)效率和代碼質(zhì)量。結(jié)合 Hibernate Validator 的強(qiáng)大功能,開發(fā)者可以輕松實(shí)現(xiàn)復(fù)雜的校驗(yàn)邏輯,同時(shí)通過(guò)自定義校驗(yàn)注解和分組校驗(yàn),滿足不同的業(yè)務(wù)需求。

希望本文能幫助你在實(shí)際項(xiàng)目中更好地使用 Spring Boot 的 Validation 功能,提高代碼的健壯性和用戶體驗(yàn)!

到此這篇關(guān)于從零到掌握Spring Boot Validation 接口校驗(yàn)的詳細(xì)過(guò)程的文章就介紹到這了,更多相關(guān)Spring Boot Validation 接口校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于SpringBoot單元測(cè)試(cobertura生成覆蓋率報(bào)告)

    關(guān)于SpringBoot單元測(cè)試(cobertura生成覆蓋率報(bào)告)

    這篇文章主要介紹了關(guān)于SpringBoot單元測(cè)試(cobertura生成覆蓋率報(bào)告),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot如何上傳圖片

    SpringBoot如何上傳圖片

    這篇文章主要介紹了SpringBoot如何上傳圖片,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-09-09
  • Java關(guān)鍵詞final示例解讀

    Java關(guān)鍵詞final示例解讀

    這篇文章主要介紹了Java關(guān)鍵詞final解讀,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • javaWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳

    javaWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳

    這篇文章主要為大家詳細(xì)介紹了JAVAWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講

    Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講

    這篇文章主要為大家介紹了Spring?Lifecycle和SmartLifecycle的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • spring簡(jiǎn)單MVC實(shí)現(xiàn)方法(URL映射及其參數(shù)使用、查詢(id、其他參數(shù))、增加)

    spring簡(jiǎn)單MVC實(shí)現(xiàn)方法(URL映射及其參數(shù)使用、查詢(id、其他參數(shù))、增加)

    這篇文章主要介紹了spring簡(jiǎn)單MVC實(shí)現(xiàn)方法(URL映射及其參數(shù)使用、查詢(id、其他參數(shù))、增加),方法參數(shù)使用包括在無(wú)注解下獲取參數(shù),使用@RequestParam 獲取參數(shù)的方法,每種方法講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 本地編譯打包項(xiàng)目部署到服務(wù)器并且啟動(dòng)方式

    本地編譯打包項(xiàng)目部署到服務(wù)器并且啟動(dòng)方式

    這篇文章主要介紹了本地編譯打包項(xiàng)目部署到服務(wù)器并且啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java源文件命名規(guī)則詳解

    Java源文件命名規(guī)則詳解

    這篇文章主要介紹了Java源文件命名規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringMVC的執(zhí)行流程及組件詳解

    SpringMVC的執(zhí)行流程及組件詳解

    這篇文章主要介紹了SpringMVC的執(zhí)行流程及組件詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • springboot druid mybatis多數(shù)據(jù)源配置方式

    springboot druid mybatis多數(shù)據(jù)源配置方式

    這篇文章主要介紹了springboot druid mybatis多數(shù)據(jù)源配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

南川市| 敦煌市| 大同市| 新竹市| 雷州市| 金川县| 清河县| 亳州市| 洪湖市| 新乡市| 进贤县| 罗定市| 礼泉县| 道孚县| 新宁县| 上高县| 平远县| 临沂市| 淮滨县| 南雄市| 汉川市| 金门县| 苏州市| 岚皋县| 平塘县| 马公市| 托里县| 咸阳市| 五指山市| 神木县| 吴旗县| 阳朔县| 福安市| 敦化市| 嘉义县| 德兴市| 文成县| 固原市| 三门峡市| 黄骅市| 大邑县|