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

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

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

概念引入

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

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

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

一 基礎(chǔ)原理

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

        <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;
    // 正則表達(dá)式
    @Pattern(regexp = "^男|女$", message = "性別只能是男或女")
    private String gender;

3 使用@Valid告訴SpringMVC進(jìn)行校驗(校驗不通過,方法通知執(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ù),獲取校驗結(jié)果。

可以進(jìn)行反饋

    // 添加員工,前端發(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);
    }

運行結(jié)果演示

二 改進(jìn)方案

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

1 沒寫全局校驗時:

2 寫了全局校驗后:

3 編寫過程:

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

    //寫一個全局校驗異常的處理(bindingResult中有校驗錯誤的信息,現(xiàn)在我們將它存放到map集合當(dāng)中進(jìn)行遍歷)
    @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 運行結(jié)果:

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

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

2 在變量千指定

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

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

可能需要調(diào)整編碼

填寫

實際應(yīng)用:

核心:

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

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

1 為了添加數(shù)據(jù)而準(zhǔn)備的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è)務(wù)修改

    // 添加員工,前端發(fā)送請求,把 json 數(shù)據(jù)封裝到 Employee 對象中
    @PostMapping(value = "/employee")
    public R add(@RequestBody @Valid EmployeeAddVo employeeAddVo) {
        //把vo轉(zhuǎn)為do(調(diào)用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)是指通過技術(shù)手段對敏感信息進(jìn)行處理,使其在不影響業(yè)務(wù)功能的前提下,無法被直接識別或還原為原始數(shù)據(jù),從而保護(hù)用戶隱私、防范數(shù)據(jù)泄露風(fēng)險。

    //查詢所有員工
    @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);
    }

脫敏成功:

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

相關(guān)文章

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

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

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

    Java日常練習(xí)題,每天進(jìn)步一點點(2)

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

    mybatis映射器配置小結(jié)

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

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

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

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

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

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

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

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

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

    使用dubbo+zookeeper+spring boot構(gòu)建服務(wù)的方法詳解

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

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

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

    SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest

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

最新評論

长宁区| 确山县| 五莲县| 二连浩特市| 山东| 遵化市| 黎城县| 兴文县| 浦城县| 光山县| 孝义市| 池州市| 扬中市| 罗田县| 邵阳县| 定州市| 堆龙德庆县| 新闻| 莒南县| 通江县| 无极县| 准格尔旗| 马山县| 宣武区| 开原市| 宝清县| 桓台县| 滨海县| 调兵山市| 泗洪县| 涡阳县| 屏边| 昌黎县| 南木林县| 扎兰屯市| 鹤庆县| 罗江县| 莲花县| 宁晋县| 海安县| 固原市|