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

如何在Spring Boot 項目中自定義 Validation 注解

 更新時間:2025年07月12日 10:49:56   作者:William一直在路上  
本文詳解SpringBoot自定義Validation注解實現(xiàn)流程,包括定義注解、編寫校驗邏輯、應(yīng)用注解及異常處理,支持多地區(qū)手機(jī)號格式校驗和復(fù)雜業(yè)務(wù)規(guī)則,提升數(shù)據(jù)合法性校驗?zāi)芰?適用于微服務(wù)架構(gòu)參數(shù)校驗實踐,感興趣的朋友一起看看吧

在Spring Boot項目中自定義Validation注解,可按以下步驟實現(xiàn),以手機(jī)號格式校驗(支持多地區(qū))為例:

一、定義自定義注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.PARAMETER}) // 作用于字段和方法參數(shù)
@Retention(RetentionPolicy.RUNTIME) // 運(yùn)行時生效
@Constraint(validatedBy = PhoneValidator.class) // 關(guān)聯(lián)校驗器
public @interface Phone {
    String message() default "手機(jī)號格式錯誤"; // 錯誤提示
    Class<?>[] groups() default {}; // 分組校驗(如新增、更新)
    Class<? extends Payload>[] payload() default {}; // 負(fù)載信息(可選)
    String region() default "CN"; // 自定義屬性:地區(qū)(默認(rèn)中國)
}

二、實現(xiàn)校驗邏輯(ConstraintValidator)

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    private String region; // 存儲注解的region屬性
    @Override
    public void initialize(Phone constraintAnnotation) {
        this.region = constraintAnnotation.region(); // 初始化,獲取地區(qū)配置
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) return true; // 允許為空(若必填需額外處理,如@NotBlank配合使用)
        // 根據(jù)地區(qū)校驗格式
        switch (region) {
            case "CN": // 中國手機(jī)號:11位,以1開頭,第二位3-9
                return value.matches("^1[3-9]\\d{9}$");
            case "US": // 美國手機(jī)號:+1開頭,后跟10位數(shù)字
                return value.matches("^\\+1\\d{10}$");
            default:
                return false; // 未知地區(qū),校驗失敗
        }
    }
}

三、應(yīng)用自定義注解

1. 在DTO中使用

public class UserDTO {
    @NotBlank
    private String username;
    @Phone(region = "CN") // 校驗中國手機(jī)號
    private String phone;
    // 若需校驗美國手機(jī)號,可設(shè)置region="US"
    // @Phone(region = "US")
    // private String usPhone;
    // getters/setters
}

2. 在Controller中觸發(fā)校驗

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
    @PostMapping("/register")
    public String register(@Validated @RequestBody UserDTO dto) {
        // 校驗通過,執(zhí)行注冊邏輯
        return "注冊成功";
    }
}

四、處理校驗異常(全局異常處理器)

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
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;
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationError(MethodArgumentNotValidException ex) {
        BindingResult result = ex.getBindingResult();
        StringBuilder errorMsg = new StringBuilder();
        for (FieldError error : result.getFieldErrors()) {
            errorMsg.append(error.getField()).append(": ").append(error.getDefaultMessage()).append("; ");
        }
        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body(new ErrorResponse(HttpStatus.BAD_REQUEST.value(), errorMsg.toString()));
    }
    static class ErrorResponse {
        private int code;
        private String message;
        public ErrorResponse(int code, String message) {
            this.code = code;
            this.message = message;
        }
        // getters
    }
}

五、擴(kuò)展功能

1. 分組校驗(如新增和更新場景)

// 定義分組接口
public interface CreateGroup {}
public interface UpdateGroup {}
// 在DTO中指定分組
@Phone(region = "CN", groups = CreateGroup.class) // 新增時校驗手機(jī)號
private String phone;
// Controller中使用分組
@PostMapping("/create")
public String create(@Validated(CreateGroup.class) @RequestBody UserDTO dto) { ... }
@PutMapping("/update")
public String update(@Validated(UpdateGroup.class) @RequestBody UserDTO dto) { ... }

2. 國際化錯誤消息

src/main/resources下創(chuàng)建ValidationMessages.properties

Phone.message=手機(jī)號格式錯誤(中文)
Phone.message_en=Invalid phone number format(英文)

Spring Boot會根據(jù)Accept-Language頭自動匹配語言。

3. 復(fù)雜業(yè)務(wù)校驗(如手機(jī)號唯一性)

// 校驗器中注入Service(需將校驗器標(biāo)記為@Component,由Spring管理)
@Component
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    @Autowired
    private UserService userService; // 假設(shè)UserService提供手機(jī)號唯一性查詢
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 先校驗格式,再校驗唯一性
        if (!isFormatValid(value)) return false;
        return !userService.existsByPhone(value); // 假設(shè)existsByPhone查詢數(shù)據(jù)庫
    }
    private boolean isFormatValid(String value) {
        // 復(fù)用之前的格式校驗邏輯
        return value.matches("^1[3-9]\\d{9}$");
    }
}

六、驗證效果

  • 合法請求phone=13812345678,校驗通過,正常處理。
  • 非法請求phone=123(格式錯誤),返回:
    {
      "code": 400,
      "message": "phone: 手機(jī)號格式錯誤; "
    }

總結(jié)

自定義Validation注解的關(guān)鍵步驟為:

  1. 定義注解:通過@Constraint關(guān)聯(lián)校驗器,設(shè)置屬性(如地區(qū)、錯誤消息)。
  2. 實現(xiàn)校驗邏輯:在ConstraintValidator中編寫具體規(guī)則(格式、唯一性等)。
  3. 應(yīng)用注解:在DTO/參數(shù)上標(biāo)注,結(jié)合@Validated觸發(fā)校驗。
  4. 處理異常:通過全局異常處理器返回標(biāo)準(zhǔn)化錯誤,提升用戶體驗。

這種方式可靈活擴(kuò)展Spring Boot的校驗?zāi)芰?,滿足復(fù)雜業(yè)務(wù)需求(如多地區(qū)格式、業(yè)務(wù)規(guī)則校驗),確保輸入數(shù)據(jù)的合法性,是微服務(wù)架構(gòu)中參數(shù)校驗的重要實踐。

到此這篇關(guān)于聊一聊在 Spring Boot 項目中自定義 Validation 注解的文章就介紹到這了,更多相關(guān)Spring Boot 自定義 Validation 注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java設(shè)計模式策略模式圖文示例詳解

    java設(shè)計模式策略模式圖文示例詳解

    這篇文章主要為大家介紹了java設(shè)計模式策略模式圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java實現(xiàn)復(fù)雜查詢優(yōu)化的7個技巧小結(jié)

    Java實現(xiàn)復(fù)雜查詢優(yōu)化的7個技巧小結(jié)

    在Java項目中,復(fù)雜查詢是開發(fā)者面臨的“硬骨頭”,本文將通過 7個實戰(zhàn)技巧,結(jié)合 代碼示例 和 性能對比,手把手教你如何讓復(fù)雜查詢變得優(yōu)雅,大家可以根據(jù)需求進(jìn)行選擇
    2025-08-08
  • Java實現(xiàn)單例模式的五種方式總結(jié)

    Java實現(xiàn)單例模式的五種方式總結(jié)

    這篇文章主要介紹了如何實現(xiàn)一個單例模式,包括構(gòu)造器私有化、提供靜態(tài)私有變量和公共獲取實例接口,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • 深入探究Java中的HashMap為什么會產(chǎn)生死循環(huán)

    深入探究Java中的HashMap為什么會產(chǎn)生死循環(huán)

    HashMap?死循環(huán)發(fā)生在?JDK?1.8?之前的版本中,這篇文章主要來和大家深入探究一下為什么Java中HashMap會產(chǎn)生死循環(huán),感興趣的小伙伴可以了解一下
    2023-05-05
  • Spring實戰(zhàn)之注入嵌套Bean操作示例

    Spring實戰(zhàn)之注入嵌套Bean操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之注入嵌套Bean操作,結(jié)合實例形式分析了嵌套Bean相關(guān)配置與使用操作技巧,需要的朋友可以參考下
    2019-11-11
  • java中處理json各種各樣的轉(zhuǎn)換方法(推薦)

    java中處理json各種各樣的轉(zhuǎn)換方法(推薦)

    下面小編就為大家分享一篇java中處理json各種各樣的轉(zhuǎn)換方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • SpringMVC中請求參數(shù)的獲取方式

    SpringMVC中請求參數(shù)的獲取方式

    這篇文章主要為大家介紹了SpringMVC中請求參數(shù)的獲取方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java實現(xiàn)json字符串格式化處理的工具類

    java實現(xiàn)json字符串格式化處理的工具類

    這篇文章主要為大家詳細(xì)介紹了如何使用java實現(xiàn)json字符串格式化處理的工具類,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • java 使用JDOM解析xml文件

    java 使用JDOM解析xml文件

    java中如何使用JDOM解析xml文件呢?以下小編就用實例為大家詳細(xì)的介紹一下。需要的朋友可以參考下
    2013-07-07
  • Java循環(huán)嵌套詳解及經(jīng)典列題

    Java循環(huán)嵌套詳解及經(jīng)典列題

    這篇文章主要給大家介紹了關(guān)于Java循環(huán)嵌套詳解及經(jīng)典列題,包括循環(huán)嵌套的結(jié)構(gòu)、變量作用域、不同類型循環(huán)的嵌套等,通過示例和經(jīng)典練習(xí)題,展示了如何使用循環(huán)嵌套解決實際問題,需要的朋友可以參考下
    2024-12-12

最新評論

景德镇市| 益阳市| 徐州市| 鄂温| 黄冈市| 永清县| 潼关县| 临洮县| 普宁市| 龙川县| 岢岚县| 舒城县| 高邮市| 长丰县| 平乡县| 那曲县| 辛集市| 临泉县| 陵水| 南京市| 高安市| 海口市| 都匀市| 左贡县| 称多县| 霍山县| 新建县| 易门县| 双峰县| 华蓥市| 连州市| 抚顺市| 蓝田县| 万州区| 民县| 儋州市| 承德县| 镇安县| 进贤县| 栾川县| 尉犁县|