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

SpringBoot使用@Valid或者@Validated時(shí)自定義校驗(yàn)的場(chǎng)景分析

 更新時(shí)間:2025年12月30日 17:16:35   作者:樂韻天城  
文章介紹了在Java開發(fā)中,如何處理需要根據(jù)多個(gè)字段進(jìn)行校驗(yàn)的自定義場(chǎng)景,通過創(chuàng)建自定義注解和實(shí)現(xiàn)相應(yīng)的約束類,可以在DTO類中對(duì)這些字段進(jìn)行復(fù)雜校驗(yàn),最后,通過全局異常處理機(jī)制,可以統(tǒng)一處理校驗(yàn)失敗的情況,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

一、自定義校驗(yàn)場(chǎng)景

平常開發(fā)項(xiàng)目想要校驗(yàn)參數(shù)是否合法一般會(huì)在類的字段上添加一些校驗(yàn)注解比如@NotEmpty、@Size、@Pattern等等,但這種是針對(duì)單個(gè)字段的校驗(yàn),當(dāng)我們有一些比較靈活的場(chǎng)景,比如根據(jù)多個(gè)字段進(jìn)行判斷應(yīng)該如何做呢。

二、添加自定義注解

場(chǎng)景:假設(shè)我們有一個(gè)注冊(cè)接口,有兩個(gè)字段分別是注冊(cè)類型(手機(jī)注冊(cè)、郵箱注冊(cè))、聯(lián)系方式,當(dāng)用戶以手機(jī)號(hào)注冊(cè)時(shí)我們需要校驗(yàn)手機(jī)號(hào)是否合法,當(dāng)用戶以郵箱注冊(cè)時(shí)我們需要校驗(yàn)郵箱是否合法。

自定義注解

package com.promote.demo.util;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {CustomValidator.class})
public @interface Custom {
    String message() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

自定義注解的約束實(shí)現(xiàn)類

package com.promote.demo.util;
import cn.hutool.core.lang.PatternPool;
import com.promote.demo.model.RegisterModel;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CustomValidator implements ConstraintValidator<Custom, RegisterModel> {
    @Override
    public boolean isValid(RegisterModel value, ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        String type = value.getType();
        int constraints = 0;
        if (StringUtils.isNotBlank(value.getContact())) {
            //是否手機(jī)號(hào)注冊(cè)
            if ("1".equals(type) && !PatternPool.MOBILE.matcher(value.getContact()).matches()) {
                context.buildConstraintViolationWithTemplate("手機(jī)號(hào)格式不正確").addConstraintViolation();
                constraints++;
            }
            //是否郵件注冊(cè)
            if ("2".equals(type) && !PatternPool.EMAIL.matcher(value.getContact()).matches()) {
                context.buildConstraintViolationWithTemplate("郵箱格式不正確").addConstraintViolation();
                constraints++;
            }
        }
        return constraints <= 0;
    }
}

注冊(cè)接口的DTO類

package com.promote.demo.model;
import com.promote.demo.util.Custom;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@Custom
public class RegisterModel implements Serializable {
    @ApiModelProperty("注冊(cè)類型")
    @NotBlank(message = "注冊(cè)類型不能為空")
    private String type;
    @ApiModelProperty("聯(lián)系方式")
    @NotBlank(message = "聯(lián)系方式不能為空")
    private String contact;
}

全局異常

package com.promote.demo.controller;
import com.promote.demo.model.BaseResponse;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.stream.Collectors;
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 攔截參數(shù)不合法異常,自定義輸出結(jié)果
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public BaseResponse<String> bindException (Exception ex) {
        BindException bindException = (BindException) ex;
        List<ObjectError> errors = bindException.getAllErrors();
        String msg = errors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(","));
        BaseResponse<String> baseResponse = new BaseResponse<>();
        baseResponse.setMsg(msg);
        baseResponse.setCode(HttpStatus.BAD_REQUEST.value());
        baseResponse.setSuccess(false);
        return baseResponse;
    }
}

三、運(yùn)行效果

到此這篇關(guān)于SpringBoot使用@Valid或者@Validated時(shí)自定義校驗(yàn)場(chǎng)景分析的文章就介紹到這了,更多相關(guān)SpringBoot @Valid @Validated自定義校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java 本地接口 JNI 使用方法

    詳解Java 本地接口 JNI 使用方法

    這篇文章主要介紹了詳解Java 本地接口 JNI 使用方法的相關(guān)資料,希望通過本文大家能徹底使用JNI編程,需要的朋友可以參考下
    2017-09-09
  • RestTemplate().postForEntity的參數(shù)使用及說明

    RestTemplate().postForEntity的參數(shù)使用及說明

    `RestTemplate().postForEntity()`是SpringFramework中用于發(fā)送HTTP POST請(qǐng)求并獲取響應(yīng)的方法,該方法接受目標(biāo)URL、請(qǐng)求體、期望的響應(yīng)類型以及可選的變量參數(shù),并返回一個(gè)包含HTTP響應(yīng)信息的`ResponseEntity`對(duì)象
    2025-12-12
  • MybatisX-Generator不生成domain文件夾的問題及解決

    MybatisX-Generator不生成domain文件夾的問題及解決

    在使用MybatisX-Generator生成數(shù)據(jù)庫(kù)表實(shí)體時(shí),如果發(fā)現(xiàn)沒有生成domain文件夾以及User.java文件,是因?yàn)镸ybatisX版本更新,最新版需要在options里額外勾選model才能生成domain,勾選model并點(diǎn)擊finish后,成功生成domain文件夾及User.java文件
    2025-01-01
  • Java中日期與時(shí)間的處理及工具類封裝詳解

    Java中日期與時(shí)間的處理及工具類封裝詳解

    在項(xiàng)目開發(fā)中免不了有對(duì)日期時(shí)間的處理,但Java中關(guān)于日期時(shí)間的類太多了,本文就來介紹一下各種類的使用及我們項(xiàng)目中應(yīng)該怎么選擇吧
    2023-07-07
  • SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的項(xiàng)目實(shí)踐

    SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的項(xiàng)目實(shí)踐

    現(xiàn)在電子商務(wù)平臺(tái)上訂單創(chuàng)建成功,等待支付,一般會(huì)給30分鐘的時(shí)間,本文主要介紹了SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java多線程之CAS機(jī)制詳解

    Java多線程之CAS機(jī)制詳解

    這篇文章主要介紹了Java多線程之CAS機(jī)制詳解,CAS指的是Compare-And-Swap(比較與交換),它是一種多線程同步的技術(shù),常用于實(shí)現(xiàn)無鎖算法,從而提高多線程程序的性能和擴(kuò)展性,需要的朋友可以參考下
    2023-07-07
  • Java?實(shí)現(xiàn)判定順序表中是否包含某個(gè)元素(思路詳解)

    Java?實(shí)現(xiàn)判定順序表中是否包含某個(gè)元素(思路詳解)

    這篇文章主要介紹了Java?實(shí)現(xiàn)判定順序表中是否包含某個(gè)元素,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • java中"==" 與equals方法的使用

    java中"==" 與equals方法的使用

    本篇文章介紹了,在java中"==" 與equals方法的使用。需要的朋友參考下
    2013-04-04
  • SpringBoot接收參數(shù)所有方式總結(jié)

    SpringBoot接收參數(shù)所有方式總結(jié)

    這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • MyBatis Log Free插件IDE下載與使用方式

    MyBatis Log Free插件IDE下載與使用方式

    這篇文章主要介紹了MyBatis Log Free插件IDE下載與使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

台江县| 阿拉尔市| 土默特左旗| 乌兰察布市| 积石山| 漠河县| 丹阳市| 克什克腾旗| 正宁县| 彭山县| 登封市| 太原市| 武山县| 常宁市| 公主岭市| 武强县| 旬邑县| 西华县| 敦化市| 称多县| 郑州市| 阿克陶县| 东阳市| 班戈县| 丽水市| 谢通门县| 永定县| 子长县| 黄浦区| 衡阳市| 鄯善县| 兴化市| 潢川县| 桑日县| 景谷| 古田县| 南宁市| 布尔津县| 石渠县| 房产| 蒲江县|