SpringBoot使用@Valid或者@Validated時(shí)自定義校驗(yàn)的場(chǎng)景分析
一、自定義校驗(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)文章希望大家以后多多支持腳本之家!
- SpringBoot參數(shù)校驗(yàn)@Validated、@Valid方式詳解
- SpringBoot利用@Validated注解優(yōu)雅實(shí)現(xiàn)參數(shù)校驗(yàn)
- SpringBoot參數(shù)校驗(yàn):@Valid與@Validated使用詳解
- SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
- springboot @validated List校驗(yàn)失效問題
- springboot使用@Validated或@Valid注解校驗(yàn)參數(shù)方式
- SpringBoot參數(shù)校驗(yàn)之@Validated的使用詳解
- SpringBoot @Validated注解實(shí)現(xiàn)參數(shù)分組校驗(yàn)的方法實(shí)例
相關(guān)文章
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生成數(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
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?實(shí)現(xiàn)判定順序表中是否包含某個(gè)元素(思路詳解)
這篇文章主要介紹了Java?實(shí)現(xiàn)判定順序表中是否包含某個(gè)元素,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
SpringBoot接收參數(shù)所有方式總結(jié)
這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07

