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

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è)務代碼耦合,難以復用
}

問題總結

  • 代碼冗余:相同校驗邏輯重復編寫
  • 維護困難:校驗規(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);
    }
}

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

三、@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嵌套對象校驗用于對象內的子對象屬性

比較常用的注解:

注解適用類型說明示例
@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ī)則(如公司內部員工編號)

五、@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)選擇校驗組

七、重點總結

優(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é)作效率

總結

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

相關文章

  • vue?vxe-table?實現(xiàn)財務記賬憑證的方案

    vue?vxe-table?實現(xiàn)財務記賬憑證的方案

    使用?vxe-table?實現(xiàn)財務記賬憑證非常簡單,實現(xiàn)在線實時編輯的記賬憑證、自動合計金額等,這篇文章主要介紹了vue?vxe-table?實現(xiàn)財務記賬憑證的方案,需要的朋友可以參考下
    2024-12-12
  • Java基礎-Java常量和常量值

    Java基礎-Java常量和常量值

    這篇文章主要介紹了Java基礎-Java常量和常量值,在程序中存在大量的數(shù)據(jù)來代表程序的狀態(tài),其中有些數(shù)據(jù)在程序運行過程中值不能發(fā)生改變,這些數(shù)據(jù)在程序中被叫做常量,下面文章對Java常量和常量值的詳細內容,需要的小伙伴可以參考一下
    2022-01-01
  • 利用Java異常機制實現(xiàn)模擬借書系統(tǒng)

    利用Java異常機制實現(xiàn)模擬借書系統(tǒng)

    這篇文章主要給大家介紹了利用Java異常機制實現(xiàn)模擬借書系統(tǒng)的相關資料,文中先對java異常機制進行了簡單介紹,而后通過示例代碼介紹了java語言是如何實現(xiàn)一個控制臺版的模擬借書系統(tǒng),需要的朋友可以參考學習,一起來看看吧。
    2017-04-04
  • Java創(chuàng)建對象的六種常用方式總結

    Java創(chuàng)建對象的六種常用方式總結

    作為Java開發(fā)者,經常創(chuàng)建很多對象,你是否知道Java中創(chuàng)建對象有哪些方式呢?下面這篇文章主要給大家介紹了關于Java創(chuàng)建對象的六種常用方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 一文詳解Java如何創(chuàng)建和銷毀對象

    一文詳解Java如何創(chuàng)建和銷毀對象

    Java由Sun Microsystems發(fā)明并在1995年發(fā)布,是世界上使用最廣泛的編程語言之一。本文主要和大家介紹一下Java是如何創(chuàng)建和銷毀對象的,希望對大家有所幫助
    2022-11-11
  • java獲取中文拼音首字母的實例

    java獲取中文拼音首字母的實例

    下面小編就為大家?guī)硪黄猨ava獲取中文拼音首字母的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • springboot整合quartz實例demo

    springboot整合quartz實例demo

    Quartz是一個開源的任務調度框架?;诙〞r、定期的策略來執(zhí)行任務是它的核心功能,比如x年x月的每個星期五上午8點到9點,每隔10分鐘執(zhí)行1次,本文重點給大家介紹springboot整合quartz的實例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • java ThreadLocal使用案例詳解

    java ThreadLocal使用案例詳解

    這篇文章主要為大家詳細介紹了java ThreadLocal的使用案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    這篇文章主要給大家介紹了關于Spring boot中Jackson操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Java關鍵字finally_動力節(jié)點Java學院整理

    Java關鍵字finally_動力節(jié)點Java學院整理

    java關鍵字finally不管是否出現(xiàn)異常,finally子句總是在塊完成之前執(zhí)行。下面通過實現(xiàn)代碼給大家介紹Java關鍵字finally相關知識,需要的的朋友參考下吧
    2017-04-04

最新評論

崇阳县| 榕江县| 肇源县| 洮南市| 穆棱市| 巫山县| 莫力| 元谋县| 江孜县| 临漳县| 桐乡市| 美姑县| 清远市| 汕尾市| 济源市| 祁东县| 巧家县| 日喀则市| 阜康市| 怀化市| 连城县| 察哈| 定兴县| 石屏县| 内黄县| 太原市| 青浦区| 康平县| 汾阳市| 扶沟县| 南雄市| 卓资县| 淳化县| 石屏县| 宜君县| 盐源县| 景德镇市| 瑞金市| 福鼎市| 安宁市| 双流县|