最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC數(shù)據(jù)校驗+VO++脫敏實戰(zhàn)指南

 更新時間:2025年03月18日 09:27:33   作者:小安同學iter  
SpringMVC通過整合BeanValidation規(guī)范,提供靈活的數(shù)據(jù)校驗機制,核心步驟包括添加校驗注解、使用@Valid觸發(fā)校驗、捕獲錯誤,可選擴展,文章還介紹了全局異常處理、自定義校驗注解以及VO層的使用,感興趣的朋友一起看看吧

概念引入

在Spring MVC中,數(shù)據(jù)校驗是確保用戶輸入符合預期規(guī)則的重要環(huán)節(jié)

Spring MVC通過整合 Bean Validation 規(guī)范,提供了靈活的數(shù)據(jù)校驗機制。核心步驟包括:

  • 在Java Bean中添加校驗注解。
  • 在Controller中使用@Valid@Validated觸發(fā)校驗。
  • 通過BindingResult或全局異常處理捕獲錯誤。
  • 可選擴展:分組校驗、自定義注解、國際化消息。

一 基礎原理

1 先將數(shù)據(jù)校驗的依賴導入

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

2 在JavaBean中編寫校驗注解

    @NotBlank(message = "名字不能為空")
    private String name;
    private Integer id;
    @Min(value = 0, message = "年齡不能小于0")
    @Max(value = 200, message = "年齡不能大于200")
    private Integer age;
    @NotBlank(message = "性別不能為空")
    private String gender;
    // 正則表達式
    @Pattern(regexp = "^男|女$", message = "性別只能是男或女")
    private String gender;

3 使用@Valid告訴SpringMVC進行校驗(校驗不通過,方法通知執(zhí)行)

    // 添加員工,前端發(fā)送請求,把 json 數(shù)據(jù)封裝到 Employee 對象中
    @PostMapping(value = "/employee")
    public R add(@RequestBody @Valid Employee employee) {
        employeeService.addEmployee(employee);
        return R.ok();
    }

4 在@Valid參數(shù)后面加上一個BindingResult參數(shù),獲取校驗結果。

可以進行反饋

    // 添加員工,前端發(fā)送請求,把 json 數(shù)據(jù)封裝到 Employee 對象中
    @PostMapping(value = "/employee")
    public R add(@RequestBody @Valid Employee employee, BindingResult bindingResult) {
        // 校驗正確
        if (!bindingResult.hasErrors()) {
            employeeService.addEmployee(employee);
            return R.ok();
        }
        Map<String, Object> errorMap = new HashMap<>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            //獲取屬性名
            String field = fieldError.getField();
            //獲取錯誤信息描述
            String message = fieldError.getDefaultMessage();
            errorMap.put(field, message);
        }
        return R.error(500, "校驗失敗", errorMap);
    }

運行結果演示

二 改進方案

編寫一個全局異常處理器處理(MethodArgumentNotValidException 校驗時出現(xiàn)的錯誤,同時返回校驗出錯的信息)

1 沒寫全局校驗時:

2 寫了全局校驗后:

3 編寫過程:

代碼實現(xiàn):(出現(xiàn)校驗錯誤就會報錯,我們將這個錯誤的方法進行封裝,達到全局的效果)

    //寫一個全局校驗異常的處理(bindingResult中有校驗錯誤的信息,現(xiàn)在我們將它存放到map集合當中進行遍歷)
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        Map<String, Object> errorMap = new HashMap<>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            //獲取屬性名
            String field = fieldError.getField();
            //獲取錯誤信息描述
            String message = fieldError.getDefaultMessage();
            errorMap.put(field, message);
        }
        return R.error(500, "校驗失敗", errorMap);
    }

三 自定義校驗注解-校驗注解綁定校驗器

1 創(chuàng)建需要的注解

完善類中的內(nèi)容:

package org.example.springmvc.annotation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import org.example.springmvc.validator.GenderValidator;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = {GenderValidator.class})
@Target({FIELD})
@Retention(RUNTIME)
public @interface Gender {
    String message() default "{jakarta.validation.constraints.NotBlank.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2 將注解類中Constrain注解中的參數(shù)方法補充

創(chuàng)建這個類:

將類中的需求寫上:

package org.example.springmvc.validator;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.example.springmvc.annotation.Gender;
public class GenderValidator implements ConstraintValidator<Gender, String> {
    @Override
    public void initialize(Gender constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return "男".equals(s) || "女".equals(s);
    }
}

3 在指定的參數(shù)加上校驗注解

    @Gender(message = "性別只能是男或女")
    private String gender;

4 運行結果:

四 拓展知識點-配置文件中獲取

1 在資源包中新建file文件(可以根據(jù)需求填寫不同的語言版本)

2 在變量千指定

    //實現(xiàn)國際化配置
    @Gender(message = "{gender.message}")
    private String gender;

3 在資源包的file文件中填寫數(shù)據(jù)

可能需要調整編碼

填寫

實際應用:

核心:

五 解決不同需求使用變量的不同校驗-VO

VO層(View Object/Value Object)在實際開發(fā)中的作用
VO層是分層架構中的核心組件之一,主要用于前端與后端的數(shù)據(jù)交互,其核心作用如下:

1 為了添加數(shù)據(jù)而準備的VO類

package org.example.springmvc.vo.req;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.example.springmvc.annotation.Gender;
@Data
public class EmployeeAddVo {
    @NotBlank(message = "名字不能為空")
    private String name;
    @Min(value = 0, message = "年齡不能小于0")
    @Max(value = 200, message = "年齡不能大于200")
    private Integer age;
    @Gender(message = "{gender.message}")
    private String gender;
}

2 為了修改數(shù)據(jù)所添加的VO類

package org.example.springmvc.vo.req;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class EmployeeUpdateVo {
    @NotNull(message = "id不能為空")
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
}

3 Controller層的業(yè)務修改

    // 添加員工,前端發(fā)送請求,把 json 數(shù)據(jù)封裝到 Employee 對象中
    @PostMapping(value = "/employee")
    public R add(@RequestBody @Valid EmployeeAddVo employeeAddVo) {
        //把vo轉為do(調用BeanUtils中的方法將屬性傳遞)
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeAddVo, employee);
        employeeService.addEmployee(employee);
        return R.ok();
    }
    // 修改員工
    @PutMapping(value = "/employee")
    public R update(@RequestBody @Valid EmployeeUpdateVo employeeUpdateVo) {
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeUpdateVo, employee);
        employeeService.updateEmployee(employee);
        return R.ok();
    }

運行代碼:

六 實現(xiàn)脫敏操作

數(shù)據(jù)脫敏(Data Masking)是指通過技術手段對敏感信息進行處理,使其在不影響業(yè)務功能的前提下,無法被直接識別或還原為原始數(shù)據(jù),從而保護用戶隱私、防范數(shù)據(jù)泄露風險。

    //查詢所有員工
    @GetMapping(value = "/employees")
    public R all() {
        // 實現(xiàn)脫敏操作將年齡隱藏(返回給前端)
        List<Employee> employees = employeeService.getList();
        List<EmployeeRespVo> collect = employees.stream().map(employee -> {
            EmployeeRespVo employeeRespVo = new EmployeeRespVo();
            BeanUtils.copyProperties(employee, employeeRespVo);
            return employeeRespVo;
        }).toList();
        return R.ok(collect);
    }

脫敏成功:

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

相關文章

  • Spring 使用JavaConfig實現(xiàn)配置的方法步驟

    Spring 使用JavaConfig實現(xiàn)配置的方法步驟

    這篇文章主要介紹了Spring 使用JavaConfig實現(xiàn)配置的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Java日常練習題,每天進步一點點(2)

    Java日常練習題,每天進步一點點(2)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • mybatis映射器配置小結

    mybatis映射器配置小結

    本文詳解MyBatis映射器配置,重點講解字段映射的三種解決方案(別名、自動駝峰映射、resultMap),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09
  • 在Java程序中使用數(shù)據(jù)庫的新方法

    在Java程序中使用數(shù)據(jù)庫的新方法

    這篇文章主要介紹了在Java程序中使用數(shù)據(jù)庫的新方法,講述了Java8以來數(shù)據(jù)庫API的一些新特性,需要的朋友可以參考下
    2015-07-07
  • Spring實現(xiàn)IoC的多種方式小結

    Spring實現(xiàn)IoC的多種方式小結

    本篇文章主要介紹了Spring實現(xiàn)IoC的多種方式小結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java 過濾器模式(Filter/Criteria Pattern)詳細介紹

    java 過濾器模式(Filter/Criteria Pattern)詳細介紹

    這篇文章主要介紹了java 過濾器模式(Filter/Criteria Pattern)詳細介紹的相關資料,需要的朋友可以參考下
    2016-10-10
  • MyBatis-Plus聯(lián)表查詢以及分頁代碼實例

    MyBatis-Plus聯(lián)表查詢以及分頁代碼實例

    在開發(fā)中遇到了一個問題,需要進行聯(lián)表查詢并進行分頁,因為不想自己來寫分頁,所以還是依靠MybatisPlus來實現(xiàn)想要的功能,下面這篇文章主要給大家介紹了關于MyBatis-Plus聯(lián)表查詢以及分頁的相關資料,需要的朋友可以參考下
    2023-06-06
  • 使用dubbo+zookeeper+spring boot構建服務的方法詳解

    使用dubbo+zookeeper+spring boot構建服務的方法詳解

    這篇文章主要給大家介紹了關于如何使用dubbo+zookeeper+spring boot構建服務的相關資料,文中通過示例代碼及圖片介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-05-05
  • Mybatis中一條SQL使用兩個foreach的問題及解決

    Mybatis中一條SQL使用兩個foreach的問題及解決

    這篇文章主要介紹了Mybatis中一條SQL使用兩個foreach的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot詳細講解異步任務如何獲取HttpServletRequest

    SpringBoot詳細講解異步任務如何獲取HttpServletRequest

    在使用框架日常開發(fā)中需要在controller中進行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案
    2022-04-04

最新評論

德令哈市| 旬邑县| 满城县| 金塔县| 阿坝| 安康市| 赣州市| 迭部县| 翁源县| 灵璧县| 乐清市| 舞阳县| 福贡县| 阿拉善盟| 新河县| 靖安县| 梧州市| 呈贡县| 阳原县| 陕西省| 新晃| 巴林右旗| 承德县| 松阳县| 汉沽区| 新晃| 饶阳县| 云阳县| 锡林郭勒盟| 陵水| 宽城| 英山县| 杭锦后旗| 佛山市| 铁岭县| 响水县| 锡林浩特市| 二连浩特市| 龙泉市| 酉阳| 茌平县|