SpringMVC数据校验+VO++脱敏实战指南
目录
- 一 基础原理
- 1 先将数据校验的依赖导入
- 2 在JavaBean中编写校验注解
- 3 使用@Valid告诉SpringMVC进行校验(校验不通过,方法通知执行)
- 4 在@Valid参数后面加上一个BindingResult参数,获取校验结果。
- 二 改进方案
- 1 没写全局校验时:
- 2 写了全局校验后:
- 3 编写过程:
- 三 自定义校验注解-校验注解绑定校验器
- 1 创建需要的注解
- 2 将注解类中Constrain注解中的参数方法补充
- 3 在指定的参数加上校验注解
- 4 运行结果:
- 四 拓展知识点-配置文件中获取
- 1 在资源包中新建file文件(可以根据需求填写不同的语言版本)
- 2 在变量千指定
- 3 在资源包的file文件中填写数据
- 五 解决不同需求使用变量的不同校验-VO
- 1 为了添加数据而准备的VO类
- 2 为了修改数据所添加的VO类
- 3 Controller层的业务修改
- 六 实现脱敏操作
概念引入
在Spring MVC中,数据校验是确保用户输入符合预期规则的重要环节
Spring MVC通过整合 Bean Validation 规范,提供了灵活的数据校验机制。核心步骤包括:
- 在Java Bean中添加校验注解。
- 在Controller中使用
@Valid
或@Validated
触发校验。 - 通过
BindingResult
或全局异常处理捕获错误。 - 可选扩展:分组校验、自定义注解、国际化消息。
一 基础原理
1 先将数据校验的依赖导入
<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进行校验(校验不通过,方法通知执行)
// 添加员工,前端发送请求,把 json 数据封装到 Employee 对象中 @PostMapping(value = "/employee") public R add(@RequestBody @Valid Employee employee) { employeeService.addEmployee(employee); return R.ok(); }
4 在@Valid参数后面加上一个BindingResult参数,获取校验结果。
可以进行反馈
// 添加员工,前端发送请求,把 json 数据封装到 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 校验时出现的错误,同时返回校验出错的信息)
1 没写全局校验时:
2 写了全局校验后:
3 编写过程:
代码实现:(出现校验错误就会报错,我们将这个错误的方法进行封装,达到全局的效果)
//写一个全局校验异常的处理(bindingResult中有校验错误的信息,现在我们将它存放到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 创建需要的注解
完善类中的内容:
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注解中的参数方法补充
创建这个类:
将类中的需求写上:
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 在指定的参数加上校验注解
@Gender(message = "性别只能是男或女") private String gender;
4 运行结果:
四 拓展知识点-配置文件中获取
1 在资源包中新建file文件(可以根据需求填写php不同的语言版本)
2 在变量千指定
//实现国际化配置 @Gender(message = "{gender.message}") private String gender;
3 在资源包的file文件中填写数据
可能需要调整编码
填写
实际应用:
核心:
五 解决不同需求使用变量的不同校验-VO
VO层(View Object/Value Object)在实际开发中的作用
VO层是分层架构中的核心组件之一,主要用于前端与后端的数据交互,其核心作用如下:1 为了添加数据而准备的VO类
package org.example.springmvc.vo.req; import jakarta.validation.constraints.Max; import japhpkarta.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 为了修改数据所添加的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层的业务修改
// 添加员工,前端发送请求,把 json 数据封装到 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(@Request编程客栈Body @Valid EmployeeUpdateVo employeeUpdateVo) { Employee employee = new Employee(); BeanUtils.copyProperties(employeeUpdateVo, employee); employeeService.updateEmployee(employee); return R.ok(); }
运行代码:
六 实现脱敏操作
数据脱敏(Data Masking)是指通过技术手段对敏感信息进行处理,使其在不影响业务功能的前提下,无法被直接识别或还原为原始数据,从而保护用户隐私、防范数据泄露风险。
//查询所有员工 @GetMapping(value = "qnqpi/employees") public R all() { // 实现脱敏操作将年龄隐藏(返回给前端) 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数据校验+VO++脱敏的文章就介绍到这了,更多相关SpringMVC数据校验内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论