SpringBoot后端數(shù)據(jù)校驗實戰(zhàn)操作指南
1.為什么后端要進(jìn)行數(shù)據(jù)校驗?
如果新增一個數(shù)據(jù),直接在前端頁面新增,由于前端代碼中有設(shè)置數(shù)據(jù)不能為空,所以不會傳入空值。但是不通過前端頁面新增一個數(shù)據(jù)時,比如使用swagger,直接訪問后端時,當(dāng)某個值為空時,可能會被傳進(jìn)數(shù)據(jù)庫,這就會造成一些問題。
2.怎么使用數(shù)據(jù)校驗?(要添加對應(yīng)依賴)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
(1)在實體上的屬性上添加校驗注解:


(2)在controller層的方法前加上注解@Validated開啟數(shù)據(jù)校驗

(3)如果每個方法要校驗的參數(shù)不同,可以使用分組校驗。
實體類上:


每個分組都要創(chuàng)建一個對應(yīng)的接口:


controller層開啟分組校驗:

@Validated注解里面支持多個分組。
@Valid注解不支持分組校驗
實現(xiàn)對手機(jī)號碼的數(shù)據(jù)校驗:
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ī)號碼格式錯誤";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}2.定義號碼的校驗類
import org.thymeleaf.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Description:手機(jī)號碼校驗
* 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.自定義校驗規(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:自定義校驗規(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)){ //非必填時填的值為空時
return true;
}else{ //非必填時填的值不為空時
return PhoneNumberValidator.isMobile(s);
}
}
}
}
4.捕獲數(shù)據(jù)校驗拋出的異常:
/**
* 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ù)校驗拋出的異常 BindException
}else if(e instanceof BindException){
BindException ex= (BindException) e;
ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR);
res.setMessage("參數(shù)校驗異常:"+ex.getAllErrors().get(0).getDefaultMessage());
return res;
}
return ResponseBean.error(ResponseBeanEnum.ERROR);
}
}
在屬性上使用這個注解:
/** 選手聯(lián)系電話 */
@IsMobile(message = "聯(lián)系電話格式不正確")
@NotNull(message = "手機(jī)號不能為空")
@Excel(name = "選手聯(lián)系電話")
private String phoneNumber;
然后在Controller類上或者方法傳入的參數(shù)前加@Validated或@Valid注解來開啟參數(shù)校驗。
入?yún)ο蟀蠒r,怎么對集合中的每個屬性進(jìn)行校驗
controller層:
加上@Validated
@PostMapping
public AjaxResult addInfo(@RequestBody @Validated TeamInfoDto teamInfoDto)
{
return toAjax(comTeamService.insert(teamInfoDto));
}
實體類中:
在要校驗的集合屬性上加@Valid這個注解,否則它只會校驗這個集合中元素是否為空,不會校驗集合中各個元素
@Data
public class TeamInfoDto {
@NotEmpty(message = "選手信息不能為空")
@Valid
private List<ComUser> user;
}
對集合中元素數(shù)據(jù)的限制設(shè)置:
在ComUser實體類中:
在想要校驗的屬性上加上對應(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ī)號不能為空")
@IsMobile(message = "手機(jī)格式不正確")
private String phoneNumber;
/** 郵箱 */
@NotEmpty(message = "郵箱不能為空")
private String email;
}
總結(jié)
到此這篇關(guān)于SpringBoot后端數(shù)據(jù)校驗的文章就介紹到這了,更多相關(guān)SpringBoot后端數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springmvc處理響應(yīng)數(shù)據(jù)的解析
今天小編就為大家分享一篇關(guān)于springmvc處理響應(yīng)數(shù)據(jù)的解析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
詳解MyBatis-Plus updateById方法更新不了空字符串/null解決方法
這篇文章主要介紹了詳解MyBatis-Plus updateById方法更新不了空字符串/null解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot整合Mysql和Redis的詳細(xì)過程
這篇文章主要介紹了SpringBoot整合Mysql和Redis的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種網(wǎng)絡(luò)技術(shù),適用于需要遠(yuǎn)程訪問本地部署服務(wù)的場景,本文主要為大家介紹了如何使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下2024-02-02
IDEA實現(xiàn)序列化時如何自動生成serialVersionUID的步驟
這篇文章主要介紹了IDEA實現(xiàn)序列化時如何自動生成serialVersionUID的步驟,首先安裝GenerateSerialVersionUID插件,當(dāng)出現(xiàn)添加serialVersionUID選項,選中則會自動生成serialVersionUID,感興趣的朋友一起學(xué)習(xí)下吧2024-02-02
SpringBoot項目沒有把依賴的jar包一起打包的問題解決
這篇文章主要介紹了SpringBoot項目沒有把依賴的jar包一起打包的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09

