欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot參數(shù)校驗的一些實戰(zhàn)應用

 更新時間:2024年11月09日 14:51:55   作者:cxykk1217  
這篇文章主要給大家介紹了關于SpringBoot參數(shù)校驗的一些實戰(zhàn)應用,包括使用內置的參數(shù)校驗注解、嵌套對象校驗、分組校驗以及自定義校驗注解,通過這些方法,可以有效地提高系統(tǒng)的穩(wěn)定性和安全性,需要的朋友可以參考下

在日常項目開發(fā)中,我們都知道參數(shù)驗證是必不可少的一環(huán),但是有時候為了偷懶,把參數(shù)校驗交給前端開發(fā)人員去處理,這樣很容易影響系統(tǒng)穩(wěn)定性和安全性,畢竟現(xiàn)在有很多手段可以繞過前端,直接后端請求接口。

本文就來介紹一下在 SpringBoot 應用中怎么進行參數(shù)校驗。

一、使用參數(shù)校驗注解

在 SpringBoot 項目中可以引用 spring-boot-starter-validation 實現(xiàn)數(shù)據(jù)驗證。spring-boot-starter-validation 不僅支持 JSR-303(Bean Validation 1.0)規(guī)范,還提供了對 JSR-380(Bean Validation 2.0)規(guī)范的全面支持??梢岳?nbsp;Bean Validation 2.0 的新特性,更靈活地定義驗證規(guī)則,包括對集合、嵌套對象的驗證等。

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

通常在實體類上的字段上使用標準的 Bean Validation 注解,以下是一些常用的參數(shù)校驗注解以及相關例子。

注解名稱

功能

@Null

檢查該字段為空

@NotNull

不能為null

@NotBlank

不能為空,常用于檢查空字符串

@NotEmpty

不能為空,多用于檢測list是否size是0

@Max

該字段的值只能小于或等于該值

@Min

該字段的值只能大于或等于該值

@Past

檢查該字段的日期是在過去

@Future

檢查該字段的日期是否是屬于將來的日期

@Email

檢查是否是一個有效的email地址

@Pattern(regex=,flag=)

被注釋的元素必須符合指定的正則表達式

@Range(min=,max=,message=)

被注釋的元素必須在合適的范圍內

@Size(min=, max=)

檢查該字段的size是否在min和max之間,可以是字符串、數(shù)組、集合、Map等

@Length(min=,max=)

檢查所屬的字段的長度是否在min和max之間,只能用于字符串

@AssertTrue

用于boolean字段,該字段只能為true

@AssertFalse

該字段的值只能為false

1.1、基本用法

1.@NotNull:校驗元素值不能為空,如果為空,則校驗失敗。

@NotNull(message = "名字不能為空")
private String userName;

2.@NotBlank:校驗字符串值不能為null和空字符串,必須包含至少一個非空字符即執(zhí)行trim(之后不為’‘)。如果元素為null或者’',則驗證失敗。

    @NotBlank(message = "昵稱不能為null和空字符串")
    private String nickName;

3.@NotEmpty:校驗集合或者數(shù)組或者字符串是否非空,通常用于集合和數(shù)組字段,需要集合和數(shù)組元素個數(shù)大于0。也可以作用于字符串,此時校驗字符串不能為null或空串(可以是一個空格)。

    @NotEmpty(message = "postIds不能為空")
    private Long[] postIds;

4.@Max:校驗數(shù)字元素最大值。

    @Max(value=100,message = "年齡最大100")
    private String age;

5.@Min:校驗數(shù)字元素最小值。

    @Min(value=18,message = "年齡最小100")
    private String age;

6.@Past:校驗日期或時間元素是否在當前時間之前。即是否是過去時間。作用于Date相關類型的字段。

    @Past(message = "")
    private Date createTime;

7.@Future:校驗日期或時間元素是否在當前時間之前。即是否是過去時間。作用于Date相關類型的字段。

    @Future(message = "")
    private Date createTime;

8.@Email:校驗字符串元素是否為有效的電子郵件地址。

    @Email(message = "")
    private String email;

9.@Pattern:根據(jù)正則表達式校驗字符串元素的格式。

    @Pattern(regexp = "[a-zA-Z0-9]+")
    private String userName;

10.@Size:校驗集合元素個數(shù)或字符串的長度在指定范圍內。

@Size(min = 3, max = 10, message = "長度在3到10之間")
private String username;

11.@Length:校驗字符串元素的長度。作用于字符串。

@Length(min = 3, max = 10, message = "長度在3到10之間")
private String username;

以上只是部分注解和他們的功能,需要詳細的了解需要查看源碼。

1.2、用法示例

定義入?yún)⒄埱髤?shù)

package com.duan.pojo.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description SysUserVO
 * @since 2024/6/17
 */
@Data
public class SysUserVO {

    @ApiModelProperty("部門ID")
    private Long deptId;

    @NotBlank(message = "名字不能為空")
    @ApiModelProperty("用戶名")
    private String userName;

    @NotBlank(message = "昵稱不能為null和空字符串")
    @ApiModelProperty("昵稱")
    private String nickName;

    @ApiModelProperty("密碼")
    private String password;

    @ApiModelProperty("用戶性別(0男,1女")
    private Integer gender;


    @ApiModelProperty("手機號碼")
    private String phone;

    @Email(message = "請?zhí)顚懻_的郵箱地址")
    @ApiModelProperty("郵箱")
    private String email;

    @ApiModelProperty("頭像地址")
    private String avatarName;

    @ApiModelProperty("用戶類型(0管理員,1普通用戶")
    private Integer userType;

    @ApiModelProperty("狀態(tài):1啟用、0禁用")
    private Integer status;

    @ApiModelProperty("備注")
    private String remark;
}

定義mapper

package com.duan.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.duan.pojo.SysUser;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface UserMapper extends BaseMapper<SysUser> {
}

定義接口

package com.duan.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.duan.pojo.SysUser;


public interface UserService extends IService<SysUser> {

    void AddUser(SysUserVO sysUserVO);
}

定義接口實現(xiàn)

package com.duan.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.duan.mapper.UserMapper;
import com.duan.pojo.SysUser;
import com.duan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author db
 * @version 1.0
 * @description UserServiceImpl
 * @since 2024/4/15
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, SysUser> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public void AddUser(SysUserVO sysUserVO) {
        SysUser sysUser = new SysUser();
        BeanUtils.copyProperties(sysUserVO,sysUser);
        userMapper.insert(sysUser);
    }
}

定義controller

package com.duan.controller;

import com.duan.pojo.ResponseResult;
import com.duan.pojo.Result;
import com.duan.pojo.SysUser;
import com.duan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author db
 * @version 1.0
 * @description UserController
 * @since 2024/4/15
 */
@RestController
@RequestMapping("/user")

public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public ResponseResult addUser(@RequestBody @Validated SysUserVO sysUserVO){
        userService.AddUser(sysUserVO);
        return ResponseResult.okResult();
    }
}

1.3、示例測試

調用增加用戶接口

注意:我們需要捕獲一下 MethodArgumentNotValidException,才能如上圖顯示的那樣。

1.4、嵌套對象的驗證

SysUserVO中增加一個address的校驗,即需要對嵌套對象進行校驗。

package com.duan.pojo.vo;

import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description AddressVO
 * @since 2024/6/17
 */
@Data
public class AddressVO {

    @NotBlank(message = "省份不能為空")
    private String province;
    @NotBlank(message = "城市不能為空")
    private String city;
}

AddressVO 對象如下所示:

package com.duan.pojo.vo;

import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description AddressVO
 * @since 2024/6/17
 */
@Data
public class AddressVO {

    @NotBlank(message = "省份不能為空")
    private String province;
    @NotBlank(message = "城市不能為空")
    private String city;
}

測試

說明:為了能夠進行嵌套對象驗證,必須手動在SysUserVO實體的addressVo字段上明確指出這個字段里面的實體需要驗證,由于@Vaildated不能作用在成員屬性上,而且 @Valid 能加在成員屬性上,同時配合controller中在方法參數(shù)上 @Validated 或 @Valid 來進行嵌套驗證。

這里必須要說明一下@Validated 和@Valid 的區(qū)別

  • 來源
  • @Validated:Spring 框架特有的注解,是標準 JSR-303 的一個變種,提供了一個分組功能
  • @Valid:標準 JSR-303 規(guī)范的標記型注解。
  • 注解位置
  • @Validated:作用在類上、方法上、方法參數(shù)上,不能作用于成員屬性上。
  • @Valid:方法、構造函數(shù)、方法參數(shù)、成員屬性上。
  • 分組
  • @Validated:支持分組驗證。
  • @Valid:支持標準的 Bean 驗證功能,不支持分組驗證。
  • 嵌套驗證
  • @Validated:不支持嵌套驗證。
  • @Valid:支持嵌套驗證。

二、分組驗證

同一個應用中,會出現(xiàn)不同的場景,比如:用戶創(chuàng)建、用戶更新、用戶刪除,針對不同的場景,有些字段在一個場景中需要驗證,但是在另一個場景中該字段就不需要驗證,我們可以選擇新建不同的實體類去解決這類問題,比如:用戶創(chuàng)建 UserCreateVO、用戶更新 UserUpdate 等,但是這樣的做法會造成類的膨脹、代碼的冗余。其實我們可以使用分組校驗有選擇的執(zhí)行特定組的參數(shù)校驗。定義分組校驗需要注意兩點:

  • 定義分組必須使用接口。
  • 要校驗的字段必須加上分組,分組只對指定分組生效,不加分組不校驗。

2.1、創(chuàng)建分組

創(chuàng)建兩個分組接口,標識不同的業(yè)務場景CreateGroup用于創(chuàng)建時指定的分組

package com.duan.validatedGroup;

/**
 * @author db
 * @version 1.0
 * @description CreateUserGroup
 * @since 2024/6/24
 */
public interface CreateUserGroup {
}

UpdateGroup用于更新時指定的分組

package com.duan.validatedGroup;

/**
 * @author db
 * @version 1.0
 * @description UpdateUserGroup
 * @since 2024/6/24
 */
public interface UpdateUserGroup {
}

2.2、使用分組校驗

分組校驗是通過在驗證注解上指定 groups 屬性來實現(xiàn)的。這個屬性允許你為驗證規(guī)則分配一個或多個驗證組。假設用戶創(chuàng)建時不傳遞用戶ID,其余的參數(shù)必傳,用戶更新接口必須傳遞用戶ID,可以不傳遞用戶名,其他參數(shù)必須傳遞。

package com.duan.pojo.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.duan.validatedGroup.CreateUserGroup;
import com.duan.validatedGroup.UpdateUserGroup;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author db
 * @version 1.0
 * @description SysUserVO
 * @since 2024/6/17
 */
@Data
public class SysUserVO {

    @NotBlank(message = "請選擇用戶",groups = UpdateUserGroup.class)
    private Long id;

    @ApiModelProperty("部門ID")
    private Long deptId;

    @NotBlank(message = "名字不能為空",groups = CreateUserGroup.class)
    @ApiModelProperty("用戶名")
    private String userName;

    @NotBlank(message = "昵稱不能為null和空字符串")
    @ApiModelProperty("昵稱")
    private String nickName;

    @ApiModelProperty("密碼")
    private String password;

    @ApiModelProperty("用戶性別(0男,1女")
    private Integer gender;


    @ApiModelProperty("手機號碼")
    private String phone;

    @Email(message = "請?zhí)顚懻_的郵箱地址")
    @ApiModelProperty("郵箱")
    private String email;

    @ApiModelProperty("頭像地址")
    private String avatarName;

    @ApiModelProperty("用戶類型(0管理員,1普通用戶")
    private Integer userType;

    @ApiModelProperty("狀態(tài):1啟用、0禁用")
    private Integer status;

    @ApiModelProperty("備注")
    private String remark;

    @NotNull(message = "請輸入地址信息")
    @Valid
    private AddressVO addressVO ;
}

2.3、在Controller中使用分組

使用@Validated 注解,并指定要執(zhí)行的驗證。

package com.duan.controller;

import com.duan.pojo.ResponseResult;
import com.duan.pojo.Result;
import com.duan.pojo.SysUser;
import com.duan.pojo.vo.SysUserVO;
import com.duan.service.UserService;
import com.duan.validatedGroup.CreateUserGroup;
import com.duan.validatedGroup.UpdateUserGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author db
 * @version 1.0
 * @description UserController
 * @since 2024/4/15
 */
@RestController
@RequestMapping("/user")

public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public ResponseResult addUser(@RequestBody @Validated(value = CreateUserGroup.class) SysUserVO sysUserVO){
        userService.addUser(sysUserVO);
        return ResponseResult.okResult();
    }

    @PostMapping("/updateUser")
    public ResponseResult updateUser(@RequestBody @Validated(value = UpdateUserGroup.class) SysUserVO sysUserVO){
        userService.updateUser(sysUserVO);
        return ResponseResult.okResult();
    }
}

2.4、測試

  • 創(chuàng)建用戶接口

username 不傳值,即不滿足 username 不能為空的條件,應該校驗不通過。通過測試發(fā)現(xiàn),會提示username不能為空。

  • 更新用戶update接口

id寫成0,username還是為空,只是報了id不能小于1

三、自定義驗證注解

在項目開發(fā)中,我們也經常使用自定義注解去完成字段校驗。自定義校驗注解步驟如下:

  • 編寫一個自定義校驗注解
  • 編寫一個自定義的校驗器
  • 關聯(lián)自定義的校驗器和自定義的校驗注解

假如:user實體中的password字段,格式是大于八位且包含數(shù)字大寫字母小寫字母,這個自定義校驗怎么實現(xiàn)呢?

1、首先定義一個注解PasswordValid

package com.duan.anno;

import com.duan.config.PasswordValidValidator;

import javax.validation.Constraint;
import javax.validation.Payload;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Constraint(validatedBy = { PasswordValidValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface PasswordValid {
    String message() default "{密碼格式不對}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

2、定義一個校驗器PasswordValidValidator

自定義校驗器需要實現(xiàn) ConstraintValidator<A extends Annotation, T>這個接口,第一個泛型是校驗注解,第二個是參數(shù)類型。

package com.duan.config;

import com.duan.anno.PasswordValid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author db
 * @version 1.0
 * @description PasswordValidValidator
 * @since 2024/6/25
 */
public class PasswordValidValidator implements ConstraintValidator<PasswordValid,String> {
    @Override
    public void initialize(PasswordValid constraintAnnotation) {

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }

        boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase);
        boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase);
        boolean hasDigit = value.chars().anyMatch(Character::isDigit);

        return value.length() >= 8 && hasUppercase && hasLowercase && hasDigit;
    }
}

3、關聯(lián)自定義的校驗器和自定義的校驗注解

當你使用 @Constraint(validatedBy = EnumValidator.class) 注解時,Java Bean Validation 的實現(xiàn)框架會自動發(fā)現(xiàn)并注冊相應的驗證器。

@Constraint(validatedBy = { PasswordValidValidator.class})

SysUserVO中使用

    @PasswordValid(groups = CreateUserGroup.class)
    @ApiModelProperty("密碼")
    private String password;

模擬輸入password為純數(shù)字時,校驗不通過。

代碼地址:https://gitee.com/duan138/practice-code/tree/master/paramValidated

四、總結

本文我們了解和實踐在 SpringBoot 項目中,怎么去使用基本的校驗注解、嵌套校驗、分組校驗,同時又學習了怎么使用自定義校驗注解,在項目中合理地使用相關校驗注解,可以簡化代碼、提高代碼可讀性和可維護性。

到此這篇關于SpringBoot參數(shù)校驗的文章就介紹到這了,更多相關SpringBoot參數(shù)校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java數(shù)據(jù)結構關于棧的實例應用

    java數(shù)據(jù)結構關于棧的實例應用

    大家好,本篇文章主要講的是java數(shù)據(jù)結構關于棧的實例應用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Maven項src/main/java目錄下配置文件無法被導出或者生效的問題和處理方案

    Maven項src/main/java目錄下配置文件無法被導出或者生效的問題和處理方案

    這篇文章主要介紹了Maven項src/main/java目錄下配置文件無法被導出或者生效的問題和處理方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Apache CXF如何把wsdl生成java代碼

    Apache CXF如何把wsdl生成java代碼

    這篇文章主要介紹了Apache CXF如何把wsdl生成java代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 非常詳細的Java異常處理機制知識整理大全

    非常詳細的Java異常處理機制知識整理大全

    Java異常指在程序運行時可能出現(xiàn)的一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤做出處理,下面這篇文章主要給大家介紹了關于Java異常處理機制知識整理的相關資料,需要的朋友可以參考下
    2022-11-11
  • Java編程中應用的GUI設計基礎

    Java編程中應用的GUI設計基礎

    這篇文章主要介紹了Java編程中應用的GUI設計基礎,為一些Java開發(fā)CS類型應用的基礎概念知識,需要的朋友可以參考下
    2015-10-10
  • java中Map如何根據(jù)key的大小進行排序詳解

    java中Map如何根據(jù)key的大小進行排序詳解

    這篇文章主要給大家介紹了關于java中Map如何根據(jù)key的大小進行排序的相關資料,有時候我們業(yè)務上需要對map里面的值按照key的大小來進行排序的時候我們就可以利用如下方法來進行排序了,需要的朋友可以參考下
    2023-09-09
  • MyBatis使用雪花ID的實現(xiàn)

    MyBatis使用雪花ID的實現(xiàn)

    本文主要介紹了MyBatis使用雪花ID的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 淺析java快速排序算法

    淺析java快速排序算法

    這篇文章主要介紹了淺析java快速排序算法,需要的朋友可以參考下
    2015-02-02
  • IDEA中的HTTP Client使用教程

    IDEA中的HTTP Client使用教程

    這篇文章主要介紹了IDEA中的HTTP Client使用教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 如何使用Spring Security手動驗證用戶的方法示例

    如何使用Spring Security手動驗證用戶的方法示例

    這篇文章主要介紹了如何使用Spring Security手動驗證用戶的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論