亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南

 更新時(shí)間:2022年07月06日 11:09:45   作者:星域_03zhan  
在項(xiàng)?開發(fā)中,對(duì)于前端提交的表單,后臺(tái)接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會(huì)加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下

1.為什么后端要進(jìn)行數(shù)據(jù)校驗(yàn)?

如果新增一個(gè)數(shù)據(jù),直接在前端頁面新增,由于前端代碼中有設(shè)置數(shù)據(jù)不能為空,所以不會(huì)傳入空值。但是不通過前端頁面新增一個(gè)數(shù)據(jù)時(shí),比如使用swagger,直接訪問后端時(shí),當(dāng)某個(gè)值為空時(shí),可能會(huì)被傳進(jìn)數(shù)據(jù)庫,這就會(huì)造成一些問題。

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開啟數(shù)據(jù)校驗(yàn)

(3)如果每個(gè)方法要校驗(yàn)的參數(shù)不同,可以使用分組校驗(yàn)。

實(shí)體類上:

每個(gè)分組都要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的接口:

controller層開啟分組校驗(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注解來開啟參數(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)文章

  • aop注解方式實(shí)現(xiàn)全局日志管理方法

    aop注解方式實(shí)現(xiàn)全局日志管理方法

    下面小編就為大家分享一篇aop注解方式實(shí)現(xiàn)全局日志管理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • idea2023遠(yuǎn)程調(diào)試springboot的過程詳解

    idea2023遠(yuǎn)程調(diào)試springboot的過程詳解

    這篇文章主要介紹了idea2023遠(yuǎn)程調(diào)試,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式

    springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java IO 文件操作方法總結(jié)

    java IO 文件操作方法總結(jié)

    這篇文章主要介紹了java IO 文件操作方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JAVA的反射機(jī)制你了解多少

    JAVA的反射機(jī)制你了解多少

    這篇文章主要為大家詳細(xì)介紹了JAVA的反射機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • JAVA截取字符串的幾種常用方法

    JAVA截取字符串的幾種常用方法

    這篇文章主要給大家介紹了關(guān)于JAVA截取字符串的幾種常用方法, 在處理字符串的過程中有很多情況下會(huì)遇到需要截取字符串的情況,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開發(fā)可視化

    SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開發(fā)可視化

    這篇文章主要介紹了SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開發(fā)可視化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說明

    Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說明

    這篇文章主要介紹了Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 圖解Spring容器中實(shí)例化bean的四種方式

    圖解Spring容器中實(shí)例化bean的四種方式

    這篇文章主要介紹了圖解Spring容器中實(shí)例化bean的四種方式,傳統(tǒng)應(yīng)用程序可以通過new和反射方式進(jìn)行實(shí)例化Bean,而Spring IOC容器則需要根據(jù) Bean 定義里的配置元數(shù)據(jù),使用反射機(jī)制來創(chuàng)建Bean,需要的朋友可以參考下
    2023-11-11
  • 淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識(shí)總結(jié)

    淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識(shí)總結(jié)

    今天帶大家了解一下Java稀疏數(shù)組的相關(guān)知識(shí),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論