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或全局異常處理捕獲錯誤。 - 可選擴展:分組校驗、自定義注解、國際化消息。
一 基礎(chǔ)原理
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ù),獲取校驗結(jié)果。
可以進行反饋
// 添加員工,前端發(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é)果演示

二 改進方案
編寫一個全局異常處理器處理(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 運行結(jié)果:

四 拓展知識點-配置文件中獲取
1 在資源包中新建file文件(可以根據(jù)需求填寫不同的語言版本)

2 在變量千指定
//實現(xiàn)國際化配置
@Gender(message = "{gender.message}")
private String gender;3 在資源包的file文件中填寫數(shù)據(jù)
可能需要調(diào)整編碼

填寫


實際應用:

核心:

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

VO層(View Object/Value Object)在實際開發(fā)中的作用
VO層是分層架構(gòu)中的核心組件之一,主要用于前端與后端的數(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轉(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ù)手段對敏感信息進行處理,使其在不影響業(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);
}脫敏成功:

到此這篇關(guān)于SpringMVC數(shù)據(jù)校驗+VO++脫敏的文章就介紹到這了,更多相關(guān)SpringMVC數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
自定義Jackson的ObjectMapper如何實現(xiàn)@ResponseBody的自定義渲染
這篇文章主要介紹了自定義Jackson的ObjectMapper如何實現(xiàn)@ResponseBody的自定義渲染,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
java中對list分頁并顯示數(shù)據(jù)到頁面實例代碼
這篇文章主要介紹了java中對list分頁并顯示數(shù)據(jù)到頁面實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
java中Date和Timestamp類型的相互轉(zhuǎn)換方式
這篇文章主要介紹了java中Date和Timestamp類型的相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

