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

SpringBoot利用Validation包實(shí)現(xiàn)高效參數(shù)校驗(yàn)

 更新時(shí)間:2025年04月18日 08:54:48   作者:程序員總部  
如果不進(jìn)行校驗(yàn)就直接使用這些數(shù)據(jù),可能會(huì)導(dǎo)致各種問題,那么SpringBoot如何利用Validation包實(shí)現(xiàn)高效參數(shù)校驗(yàn)?zāi)?下面讓我們一起來探討這個(gè)重要的話題吧

在開發(fā)后端服務(wù)時(shí),我們經(jīng)常需要處理用戶輸入的數(shù)據(jù)。這些數(shù)據(jù)可能來自表單、API請(qǐng)求或者其他渠道。如果不進(jìn)行校驗(yàn)就直接使用這些數(shù)據(jù),可能會(huì)導(dǎo)致各種問題,比如數(shù)據(jù)庫注入、系統(tǒng)崩潰或者業(yè)務(wù)邏輯錯(cuò)誤。那么SpringBoot如何利用Validation包實(shí)現(xiàn)高效參數(shù)校驗(yàn)?zāi)兀孔屛覀円黄饋硖接戇@個(gè)重要的話題!

首先我們需要明白參數(shù)校驗(yàn)的重要性。想象一下你正在開發(fā)一個(gè)用戶注冊(cè)接口,用戶需要提供用戶名、密碼和郵箱。如果沒有校驗(yàn):

  • 用戶名可能是空字符串
  • 密碼可能太短
  • 郵箱格式可能不正確

這樣的數(shù)據(jù)存入數(shù)據(jù)庫后會(huì)產(chǎn)生一系列問題。而SpringBoot的Validation包就是為了解決這些問題而生的!

基本使用

要在SpringBoot中使用Validation,首先需要在pom.xml中添加依賴:

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

然后我們就可以在實(shí)體類中使用各種注解來定義校驗(yàn)規(guī)則了。比如:

public class User {
    @NotBlank(message = "用戶名不能為空")
    @Size(min = 4, max = 20, message = "用戶名長度必須在4到20個(gè)字符之間")
    private String username;
    
    @NotBlank(message = "密碼不能為空")
    @Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$", 
             message = "密碼必須包含大小寫字母和數(shù)字,且長度不小于8")
    private String password;
    
    @Email(message = "郵箱格式不正確")
    private String email;
}

控制器校驗(yàn)

在控制器中,我們需要使用@Valid注解來觸發(fā)校驗(yàn):

@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestBody @Valid User user) {
    // 業(yè)務(wù)邏輯處理
    return ResponseEntity.ok("注冊(cè)成功");
}

當(dāng)校驗(yàn)失敗時(shí),SpringBoot會(huì)自動(dòng)返回400錯(cuò)誤并包含詳細(xì)的錯(cuò)誤信息。這對(duì)于前端開發(fā)人員來說非常友好,他們能清楚地知道哪里出了問題。

自定義校驗(yàn)

有時(shí)候內(nèi)置的校驗(yàn)規(guī)則不能滿足我們的需求。這時(shí)我們可以創(chuàng)建自定義校驗(yàn)注解。比如我們要校驗(yàn)手機(jī)號(hào)格式:

首先定義注解:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
public @interface PhoneNumber {
    String message() default "手機(jī)號(hào)格式不正確";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

然后實(shí)現(xiàn)校驗(yàn)邏輯:

public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) return false;
        return value.matches("^1[3-9]\\d{9}$");
    }
}

異常處理

雖然SpringBoot提供了默認(rèn)的錯(cuò)誤響應(yīng),但在實(shí)際項(xiàng)目中我們通常需要自定義錯(cuò)誤處理。這時(shí)可以使用@ControllerAdvice:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.toList());
        
        return ResponseEntity.badRequest().body(new ErrorResponse(errors));
    }
}

這樣就能返回統(tǒng)一的錯(cuò)誤格式了。說到統(tǒng)一的錯(cuò)誤處理,【程序員總部】這個(gè)公眾號(hào)最近發(fā)布了一篇關(guān)于SpringBoot全局異常處理的深度解析文章。這個(gè)公眾號(hào)是字節(jié)11年技術(shù)大佬創(chuàng)辦的,聚集了阿里、字節(jié)、百度等大廠的技術(shù)專家,經(jīng)常分享各種實(shí)戰(zhàn)經(jīng)驗(yàn)和底層原理,值得關(guān)注!

分組校驗(yàn)

有時(shí)候同一個(gè)實(shí)體在不同場(chǎng)景下需要不同的校驗(yàn)規(guī)則。比如創(chuàng)建用戶時(shí)需要校驗(yàn)所有字段,而更新用戶時(shí)可能只需要校驗(yàn)部分字段。這時(shí)可以使用分組校驗(yàn):

public class User {
    interface Create {}
    interface Update {}
    
    @NotBlank(groups = {Create.class, Update.class})
    private String username;
    
    @NotBlank(groups = Create.class)
    private String password;
}

在控制器中可以指定使用哪個(gè)分組:

@PostMapping("/users")
public ResponseEntity createUser(@RequestBody @Validated(User.Create.class) User user) {
    // ...
}

@PutMapping("/users/{id}")
public ResponseEntity updateUser(@PathVariable Long id, 
                                @RequestBody @Validated(User.Update.class) User user) {
    // ...
}

性能考慮

雖然參數(shù)校驗(yàn)很重要,但也要注意性能影響。以下是一些優(yōu)化建議:

  • 簡(jiǎn)單的校驗(yàn)(如非空、長度)優(yōu)先使用內(nèi)置注解
  • 復(fù)雜的業(yè)務(wù)校驗(yàn)可以考慮放在Service層
  • 正則表達(dá)式要盡量高效,避免過度復(fù)雜的模式

測(cè)試驗(yàn)證

最后別忘了為你的校驗(yàn)邏輯編寫測(cè)試用例:

@SpringBootTest
class UserValidationTest {
    @Autowired
    private Validator validator;
    
    @Test
    void whenUsernameIsBlank_thenValidationFails() {
        User user = new User();
        user.setUsername("");
        user.setPassword("ValidPass123");
        
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        assertFalse(violations.isEmpty());
    }
}

通過以上內(nèi)容,我們?cè)敿?xì)探討了SpringBoot如何使用Validation包進(jìn)行參數(shù)校驗(yàn)。從基本使用到高級(jí)技巧,從性能考慮到測(cè)試驗(yàn)證,這些知識(shí)點(diǎn)能幫助開發(fā)者構(gòu)建更健壯的后端服務(wù)。記住,良好的參數(shù)校驗(yàn)是系統(tǒng)安全的第一道防線,也是提升用戶體驗(yàn)的重要環(huán)節(jié)!

以上就是SpringBoot利用Validation包實(shí)現(xiàn)高效參數(shù)校驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Validation參數(shù)校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA面向?qū)ο?封裝原理及實(shí)例解析

    JAVA面向?qū)ο?封裝原理及實(shí)例解析

    這篇文章主要介紹了JAVA面向?qū)ο?封裝原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring?Boot集成etcd的詳細(xì)過程

    Spring?Boot集成etcd的詳細(xì)過程

    etcd是一個(gè)分布式鍵值存儲(chǔ)數(shù)據(jù)庫,用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺(tái)支持,很小的二進(jìn)制文件和強(qiáng)大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    驗(yàn)證碼登錄是非常常見的一種登錄方式,能夠簡(jiǎn)化用戶登錄的過程,本文主要介紹了SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 解決maven build 無反應(yīng),直接terminated的問題

    解決maven build 無反應(yīng),直接terminated的問題

    下面小編就為大家?guī)硪黄鉀Qmaven build 無反應(yīng),直接terminated的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • MyBatis-Plus實(shí)現(xiàn)字段自動(dòng)填充功能的示例

    MyBatis-Plus實(shí)現(xiàn)字段自動(dòng)填充功能的示例

    本文主要介紹了MyBatis-Plus實(shí)現(xiàn)字段自動(dòng)填充功能的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 由淺到深帶你詳談Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式

    由淺到深帶你詳談Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式

    這篇文章主要詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式,新建一個(gè)數(shù)組,把原來數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價(jià)值,需要的朋友可以借鑒一下
    2023-06-06
  • java讀取properties配置文件的方法

    java讀取properties配置文件的方法

    這篇文章主要介紹了java讀取properties配置文件的方法,涉及java操作properties配置文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了SpringBoot統(tǒng)計(jì)一個(gè)Bean中方法的調(diào)用次數(shù)的實(shí)現(xiàn)步驟,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • JVM類加載之雙親委派機(jī)制解讀

    JVM類加載之雙親委派機(jī)制解讀

    這篇文章主要介紹了JVM類加載之雙親委派機(jī)制解讀,類加載階段分為加載、連接、初始化三個(gè)階段,而加載階段需要通過類的全限定名來獲取定義了此類的二進(jìn)制字節(jié)流,Java特意把這一步抽出來用類加載器來實(shí)現(xiàn),需要的朋友可以參考下
    2023-12-12
  • RocketMQ事務(wù)消息使用與原理詳解

    RocketMQ事務(wù)消息使用與原理詳解

    這篇文章主要為大家介紹了RocketMQ事務(wù)消息的實(shí)現(xiàn)原理,在分布式事務(wù)解決方案中,事務(wù)消息也是一個(gè)不錯(cuò)的解決方案,本篇文章將圍繞RocketMQ的事務(wù)消息實(shí)現(xiàn)展開描述,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

东兰县| 蒙城县| 鹿邑县| 聂荣县| 玛沁县| 杭州市| 夏邑县| 内丘县| 德令哈市| 内丘县| 吕梁市| 新源县| 鹿泉市| 喀喇| 张家口市| 江源县| 肇东市| 元氏县| 济阳县| 淳化县| 通榆县| 故城县| 荃湾区| 江山市| 铜梁县| 海晏县| 汨罗市| 张掖市| 林周县| 临沧市| 信宜市| 黄平县| 唐海县| 如皋市| 黔西县| 长宁区| 榕江县| 九龙城区| 乡城县| 波密县| 宝兴县|