SpringMVC數(shù)據(jù)校驗+VO++脫敏實戰(zhàn)指南
概念引入
在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)配置的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
java 過濾器模式(Filter/Criteria Pattern)詳細介紹
這篇文章主要介紹了java 過濾器模式(Filter/Criteria Pattern)詳細介紹的相關資料,需要的朋友可以參考下2016-10-10
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構建服務的相關資料,文中通過示例代碼及圖片介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-05-05
Mybatis中一條SQL使用兩個foreach的問題及解決
這篇文章主要介紹了Mybatis中一條SQL使用兩個foreach的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot詳細講解異步任務如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04

