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

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

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

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

一、定義自定義注解

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

二、實現(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": // 中國手機號:11位,以1開頭,第二位3-9
                return value.matches("^1[3-9]\\d{9}$");
            case "US": // 美國手機號:+1開頭,后跟10位數(shù)字
                return value.matches("^\\+1\\d{10}$");
            default:
                return false; // 未知地區(qū),校驗失敗
        }
    }
}

三、應用自定義注解

1. 在DTO中使用

public class UserDTO {
    @NotBlank
    private String username;
    @Phone(region = "CN") // 校驗中國手機號
    private String phone;
    // 若需校驗美國手機號,可設置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
    }
}

五、擴展功能

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

// 定義分組接口
public interface CreateGroup {}
public interface UpdateGroup {}
// 在DTO中指定分組
@Phone(region = "CN", groups = CreateGroup.class) // 新增時校驗手機號
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=手機號格式錯誤(中文)
Phone.message_en=Invalid phone number format(英文)

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

3. 復雜業(yè)務校驗(如手機號唯一性)

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

六、驗證效果

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

總結

自定義Validation注解的關鍵步驟為:

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

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

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

相關文章

  • java設計模式策略模式圖文示例詳解

    java設計模式策略模式圖文示例詳解

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

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

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

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

    這篇文章主要介紹了如何實現(xiàn)一個單例模式,包括構造器私有化、提供靜態(tài)私有變量和公共獲取實例接口,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    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操作,結合實例形式分析了嵌套Bean相關配置與使用操作技巧,需要的朋友可以參考下
    2019-11-11
  • java中處理json各種各樣的轉換方法(推薦)

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

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

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

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

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

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

    java 使用JDOM解析xml文件

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

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

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

最新評論

府谷县| 华安县| 介休市| 铁力市| 琼海市| 大余县| 宜宾市| 新疆| 孝义市| 荔波县| 巴青县| 九台市| 盘锦市| 军事| 白银市| 晋城| 皋兰县| 佛冈县| 德阳市| 保靖县| 丹寨县| 南陵县| 昔阳县| 正阳县| 长丰县| 军事| 宝丰县| 屏南县| 吴旗县| 寿宁县| 包头市| 延长县| 辽源市| 贵州省| 利津县| 米泉市| 桐庐县| 丰顺县| 松原市| 新余市| 仪陇县|