SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南
1.為什么后端要進(jìn)行數(shù)據(jù)校驗(yàn)?
如果新增一個(gè)數(shù)據(jù),直接在前端頁(yè)面新增,由于前端代碼中有設(shè)置數(shù)據(jù)不能為空,所以不會(huì)傳入空值。但是不通過(guò)前端頁(yè)面新增一個(gè)數(shù)據(jù)時(shí),比如使用swagger,直接訪問(wèn)后端時(shí),當(dāng)某個(gè)值為空時(shí),可能會(huì)被傳進(jìn)數(shù)據(jù)庫(kù),這就會(huì)造成一些問(wèn)題。
2.怎么使用數(shù)據(jù)校驗(yàn)?(要添加對(duì)應(yīng)依賴)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.3.2.RELEASE</version> </dependency>
(1)在實(shí)體上的屬性上添加校驗(yàn)注解:
(2)在controller層的方法前加上注解@Validated開(kāi)啟數(shù)據(jù)校驗(yàn)
(3)如果每個(gè)方法要校驗(yàn)的參數(shù)不同,可以使用分組校驗(yàn)。
實(shí)體類上:
每個(gè)分組都要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的接口:
controller層開(kāi)啟分組校驗(yàn):
@Validated注解里面支持多個(gè)分組。
@Valid注解不支持分組校驗(yàn)
實(shí)現(xiàn)對(duì)手機(jī)號(hào)碼的數(shù)據(jù)校驗(yàn):
1.自定義注解:
import com.seckill.validator.IsMobileValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint( validatedBy = {IsMobileValidator.class} ) public @interface IsMobile { // 默認(rèn)為true boolean required() default true; String message() default "手機(jī)號(hào)碼格式錯(cuò)誤"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2.定義號(hào)碼的校驗(yàn)類
import org.thymeleaf.util.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Description:手機(jī)號(hào)碼校驗(yàn) * Date: 2022/6/28 15:28 **/ public class PhoneNumberValidator { // 正則表達(dá)式 private static final Pattern mobile_pattern=Pattern.compile("^1(3[0-9]|5[0-3,5-9]|7[0-3,5-8]|8[0-9])\\d{8}$"); public static boolean isMobile(String mobile){ if(StringUtils.isEmpty(mobile)){ return false; } Matcher matcher = mobile_pattern.matcher(mobile); return matcher.matches(); } }
3.自定義校驗(yàn)規(guī)則
import com.seckill.annotations.IsMobile; import com.seckill.utils.PhoneNumberValidator; import org.thymeleaf.util.StringUtils; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * Description:自定義校驗(yàn)規(guī)則 * Date: 2022/6/28 16:59 **/ public class IsMobileValidator implements ConstraintValidator<IsMobile,String> { private boolean required=false; @Override public void initialize(IsMobile constraintAnnotation) { //先獲取到填的值 true/false required=constraintAnnotation.required(); } @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { // 判斷是否為必填 if(required){ //必填 return PhoneNumberValidator.isMobile(s); }else { //非必填 if(StringUtils.isEmpty(s)){ //非必填時(shí)填的值為空時(shí) return true; }else{ //非必填時(shí)填的值不為空時(shí) return PhoneNumberValidator.isMobile(s); } } } }
4.捕獲數(shù)據(jù)校驗(yàn)拋出的異常:
/** * Description:全局異常處理類 * Date: 2022/6/28 17:35 **/ @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseBean ExceptionHandler(Exception e){ if(e instanceof GlobalException){ GlobalException ex= (GlobalException) e; return ResponseBean.error(ex.getResponseBeanEnum()); // 處理參數(shù)校驗(yàn)拋出的異常 BindException }else if(e instanceof BindException){ BindException ex= (BindException) e; ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR); res.setMessage("參數(shù)校驗(yàn)異常:"+ex.getAllErrors().get(0).getDefaultMessage()); return res; } return ResponseBean.error(ResponseBeanEnum.ERROR); } }
在屬性上使用這個(gè)注解:
/** 選手聯(lián)系電話 */ @IsMobile(message = "聯(lián)系電話格式不正確") @NotNull(message = "手機(jī)號(hào)不能為空") @Excel(name = "選手聯(lián)系電話") private String phoneNumber;
然后在Controller類上或者方法傳入的參數(shù)前加@Validated或@Valid注解來(lái)開(kāi)啟參數(shù)校驗(yàn)。
入?yún)?duì)象包含集合時(shí),怎么對(duì)集合中的每個(gè)屬性進(jìn)行校驗(yàn)
controller層:
加上@Validated
@PostMapping public AjaxResult addInfo(@RequestBody @Validated TeamInfoDto teamInfoDto) { return toAjax(comTeamService.insert(teamInfoDto)); }
實(shí)體類中:
在要校驗(yàn)的集合屬性上加@Valid這個(gè)注解,否則它只會(huì)校驗(yàn)這個(gè)集合中元素是否為空,不會(huì)校驗(yàn)集合中各個(gè)元素
@Data public class TeamInfoDto { @NotEmpty(message = "選手信息不能為空") @Valid private List<ComUser> user; }
對(duì)集合中元素?cái)?shù)據(jù)的限制設(shè)置:
在ComUser實(shí)體類中:
在想要校驗(yàn)的屬性上加上對(duì)應(yīng)注解
public class ComUser extends BaseEntity { private static final long serialVersionUID = 1L; private Long id; /** 選手姓名 */ @NotNull(message = "姓名不能為空") private String name; /** 選手聯(lián)系電話 */ @NotNull(message = "手機(jī)號(hào)不能為空") @IsMobile(message = "手機(jī)格式不正確") private String phoneNumber; /** 郵箱 */ @NotEmpty(message = "郵箱不能為空") private String email; }
總結(jié)
到此這篇關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringBoot后端數(shù)據(jù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea2023遠(yuǎn)程調(diào)試springboot的過(guò)程詳解
這篇文章主要介紹了idea2023遠(yuǎn)程調(diào)試,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開(kāi)發(fā)可視化
這篇文章主要介紹了SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開(kāi)發(fā)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說(shuō)明
這篇文章主要介紹了Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識(shí)總結(jié)
今天帶大家了解一下Java稀疏數(shù)組的相關(guān)知識(shí),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05