首頁 > 軟體

SpringBoot後端資料校驗實戰操作指南

2022-07-06 14:04:18

1.為什麼後端要進行資料校驗?

如果新增一個資料,直接在前端頁面新增,由於前端程式碼中有設定資料不能為空,所以不會傳入空值。但是不通過前端頁面新增一個資料時,比如使用swagger,直接存取後端時,當某個值為空時,可能會被傳進資料庫,這就會造成一些問題。

2.怎麼使用資料校驗?(要新增對應依賴)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>

(1)在實體上的屬性上新增校驗註解:

(2)在controller層的方法前加上註解@Validated開啟資料校驗

(3)如果每個方法要校驗的引數不同,可以使用分組校驗。

實體類上:

每個分組都要建立一個對應的介面:

controller層開啟分組校驗:

@Validated註解裡面支援多個分組。

@Valid註解不支援分組校驗

實現對手機號碼的資料校驗:

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 {
//    預設為true
    boolean required() default true;

    String message() default "手機號碼格式錯誤";

    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:手機號碼校驗
 * Date: 2022/6/28 15:28
 **/
public class PhoneNumberValidator {
//    正規表示式
    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.自定義校驗規則

import com.seckill.annotations.IsMobile;
import com.seckill.utils.PhoneNumberValidator;
import org.thymeleaf.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * Description:自定義校驗規則
 * 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.捕獲資料校驗丟擲的異常:

/**
 * 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());
            //			處理引數校驗丟擲的異常 BindException
        }else if(e instanceof BindException){
            BindException ex= (BindException) e;
            ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR);
            res.setMessage("引數校驗異常:"+ex.getAllErrors().get(0).getDefaultMessage());
            return res;

        }
        return ResponseBean.error(ResponseBeanEnum.ERROR);
    }
}

在屬性上使用這個註解:

    /** 選手聯絡電話 */
    @IsMobile(message = "聯絡電話格式不正確")
    @NotNull(message = "手機號不能為空")
    @Excel(name = "選手聯絡電話")
    private String phoneNumber;

然後在Controller類上或者方法傳入的引數前加@Validated或@Valid註解來開啟引數校驗。

入參物件包含集合時,怎麼對集合中的每個屬性進行校驗

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;
}

對集合中元素資料的限制設定:

在ComUser實體類中:

在想要校驗的屬性上加上對應註解

public class ComUser extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    private Long id;

    /** 選手姓名 */
    @NotNull(message = "姓名不能為空")
    private String name;

    /** 選手聯絡電話 */
    @NotNull(message = "手機號不能為空")
    @IsMobile(message = "手機格式不正確")
    private String phoneNumber;

    /** 郵箱 */
    @NotEmpty(message = "郵箱不能為空")
    private String email;
}

總結

到此這篇關於SpringBoot後端資料校驗的文章就介紹到這了,更多相關SpringBoot後端資料校驗內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com