亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot參數(shù)校驗:@Valid與@Validated使用詳解

 更新時間:2025年03月13日 11:11:05   作者:L_!??!  
這篇文章主要介紹了SpringBoot參數(shù)校驗:@Valid與@Validated使用詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、案例(參數(shù)校驗的必要性)

傳統(tǒng)方式(無注解)的缺點:

// 需要手動校驗每個字段,代碼冗余且易出錯
public String register(User user) {
    // 手動校驗每個字段
    if (user.getEmail() == null || !isValidEmail(user.getEmail())) {
        throw new IllegalArgumentException("郵箱格式錯誤");
    }
    if (user.getPassword().length() < 8) {
        throw new IllegalArgumentException("密碼長度需≥8位");
    }
    // 校驗邏輯與業(yè)務代碼耦合,難以復用
}

問題總結(jié)

  • 代碼冗余:相同校驗邏輯重復編寫
  • 維護困難:校驗規(guī)則分散,修改成本高
  • 可讀性差:業(yè)務邏輯被大量if-else淹沒

注解方式的優(yōu)勢

public class User {
    @Email(message = "郵箱格式不合法")  // 一行注解替代復雜校驗
    private String email;
    
    @Size(min = 8, message = "密碼長度需≥8位")
    private String password;
}

@PostMapping("/register")
public String register(@Valid @RequestBody User user) { 
    // 校驗邏輯由框架自動處理
    return "success";
}

核心優(yōu)勢

  • 聲明式校驗:通過注解自動完成參數(shù)驗證
  • 代碼簡潔:減少冗余的if-else判斷
  • 統(tǒng)一規(guī)范:標準化校驗規(guī)則,降低維護成本

二、@Valid 注解

簡介

  • Java標準注解(javax.validation)
  • 用于觸發(fā) Bean Validation 校驗機制
  • 可校驗方法參數(shù)成員屬性

SpringBoot配置

<!-- pom.xml 必須依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

使用示例

public class User {
    @NotNull(message = "用戶名不能為空")
    private String name;
    
    @Min(value = 18, message = "年齡必須≥18歲")
    private Integer age;
}

@PostMapping("/users")
public String createUser(@Valid @RequestBody User user) { // 觸發(fā)校驗
    return "success";
}

全局異常處理(核心實踐)

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    // 處理@Valid/@Validated拋出的校驗異常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        return ResponseEntity.badRequest().body(errors);
    }
}

效果:自動返回結(jié)構(gòu)化錯誤信息(字段名+錯誤描述)

三、@Validated 注解

簡介

  • Spring框架注解(org.springframework.validation.annotation)(@Validated是Spring框架提供的,導入springboot的依賴就會自動導入這個依賴)
  • 支持分組校驗(Group Validation)
  • 可標注在類、方法、參數(shù)

核心功能

// 分組接口定義
public interface CreateGroup {} 
public interface UpdateGroup {}

public class User {
    @NotBlank(groups = CreateGroup.class)
    private String name;
    
    @NotNull(groups = {CreateGroup.class, UpdateGroup.class})
    private Integer age;
}

// 使用分組校驗
@PostMapping("/users")
public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {
    return "success";
}

四、常用校驗注解

最常用的注解:

注解說明示例
@NotNull值不能為null@NotNull(message="字段必填")
@NotBlank字符串非空(trim后)適用于用戶名、密碼等
@Min/@Max數(shù)值范圍限制@Min(18)
@Pattern正則表達式校驗@Pattern(regexp="^1[3-9]\\d{9}$")
@Valid嵌套對象校驗用于對象內(nèi)的子對象屬性

比較常用的注解:

注解適用類型說明示例
@FutureDate日期必須在未來@Future(message="截止時間無效")
@Digits數(shù)值類型整數(shù)位和小數(shù)位限制@Digits(integer=3, fraction=2)
@Negative數(shù)值類型必須為負數(shù)常用于財務系統(tǒng)
@NotEmpty集合/字符串集合非空或字符串長度>0比@NotBlank更寬松

組合注解(自定義)

// 自定義手機號校驗注解
@Documented
@Constraint(validatedBy = PhoneValidator.class)
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Phone {
    String message() default "手機號格式不合法";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

// 校驗邏輯實現(xiàn)
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");
    
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && PHONE_PATTERN.matcher(value).matches();
    }
}

使用場景:復用企業(yè)特定校驗規(guī)則(如公司內(nèi)部員工編號)

五、@Valid 與 @Validated 區(qū)別

特性@Valid@Validated
標準規(guī)范JSR-303/JSR-349 標準Spring 框架擴展
分組校驗不支持支持
嵌套校驗需要顯式添加@Valid不自動支持嵌套校驗
作用位置方法參數(shù)、成員屬性類、方法、參數(shù)

六、高頻問題與最佳實踐

常見問題排查

注解不生效

  • 檢查是否忘記添加@Valid/@Validated
  • 確保校驗對象未被@RequestBody等注解錯誤包裹

嵌套校驗失敗

  • 確認在嵌套對象屬性上添加了@Valid

性能優(yōu)化建議

  • 避免過度校驗:在Controller層做基礎校驗,復雜邏輯放到Service層
  • 使用分組校驗:減少不必要的校驗開銷

高級技巧

// 動態(tài)分組校驗(根據(jù)請求參數(shù)決定校驗組)
@Validated
@RestController
public class UserController {
    
    @PostMapping("/users")
    public String createUser(
        @RequestParam String type,
        @Validated({Default.class, type.equals("vip") ? VipGroup.class : Default.class}) 
        @RequestBody User user
    ) {
        return "success";
    }
}

實現(xiàn)原理:利用Spring EL表達式動態(tài)選擇校驗組

七、重點總結(jié)

優(yōu)先使用場景

  • 優(yōu)先使用@Valid的場景:嵌套對象校驗、與非Spring框架整合
  • 優(yōu)先使用@Validated的場景:需要分組校驗、校驗Service層方法參數(shù)

配置要點

  • 要想使用@Valid必須添加spring-boot-starter-validation依賴
  • 校驗失敗會拋出MethodArgumentNotValidException

最佳實踐

// 嵌套校驗示例
public class Order {
    @Valid  // 必須顯式添加
    private User user;
}

// 分組校驗示例
@Validated(UpdateGroup.class)
public void updateUser(@RequestBody User user) {}

校驗流程

請求參數(shù) → 注解聲明 → 自動校驗 → 異常處理(@ControllerAdvice)

相較傳統(tǒng)參數(shù)校驗優(yōu)勢

  • 減少70%以上的參數(shù)校驗代碼量
  • 通過統(tǒng)一異常處理實現(xiàn)錯誤響應的標準化
  • 提升代碼可維護性和團隊協(xié)作效率

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java之SpringCloud nocos注冊中心講解

    Java之SpringCloud nocos注冊中心講解

    這篇文章主要介紹了Java之SpringCloud nocos注冊中心講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java 替換word文檔文字并指定位置插入圖片

    Java 替換word文檔文字并指定位置插入圖片

    這篇文章主要介紹了Java 替換word文檔文字,指定位置插入圖片功能,本文通過實例代碼給大家講解,需要的朋友可以參考下
    2018-02-02
  • Java多線程Future松獲取異步任務結(jié)果輕松實現(xiàn)

    Java多線程Future松獲取異步任務結(jié)果輕松實現(xiàn)

    這篇文章主要為大家介紹了Java多線程Future松獲取異步任務結(jié)果輕松實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)

    Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)

    這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(zhuǎn)Tree結(jié)構(gòu),文中的示例代碼簡潔易懂,感興趣的小伙伴可以參考一下
    2024-10-10
  • 使用springboot整合mybatis-plus實現(xiàn)數(shù)據(jù)庫的增刪查改示例

    使用springboot整合mybatis-plus實現(xiàn)數(shù)據(jù)庫的增刪查改示例

    這篇文章主要介紹了使用springboot整合mybatis-plus實現(xiàn)數(shù)據(jù)庫的增刪查改示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 通過實例了解JavaBean開發(fā)及使用過程解析

    通過實例了解JavaBean開發(fā)及使用過程解析

    這篇文章主要介紹了通過實例了解JavaBean開發(fā)及使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • java中transient關鍵字分析

    java中transient關鍵字分析

    這篇文章主要介紹了java中transient關鍵字分析,transient與類對象的序列化息息相關,序列化保存的是 類對象 狀態(tài),被transient關鍵字修飾的成員變量,在類的實例化對象的序列化處理過程中會被忽略,變量不會貫穿對象的序列化和反序列化,需要的朋友可以參考下
    2023-09-09
  • Java簡單工廠和工廠方法模式詳細解析

    Java簡單工廠和工廠方法模式詳細解析

    這篇文章主要介紹了Java簡單工廠和工廠方法模式詳細解析,簡單工廠模式屬于類的創(chuàng)新型模式,又叫靜態(tài)工廠方法模式是通過專門定義一個類來負責創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都具有共同的父類,需要的朋友可以參考下
    2023-12-12
  • 一篇文中細看Java多線程的創(chuàng)建方式

    一篇文中細看Java多線程的創(chuàng)建方式

    隨著計算機的配置越來越高,我們需要將進程進一步優(yōu)化,細分為線程,充分提高圖形化界面的多線程的開發(fā),這篇文章主要給大家介紹了如何通過一篇文中細看Java多線程的創(chuàng)建方式,需要的朋友可以參考下
    2021-07-07
  • Java socket字節(jié)流傳輸示例解析

    Java socket字節(jié)流傳輸示例解析

    這篇文章主要為大家詳細介紹了Java socket字節(jié)流傳輸示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論