网站首页 > 精选教程 正文
今日头条的 Java 小伙伴们!今天咱要深入聊聊 Spring Boot 结合 Validation 封装参数校验这个超实用且关键的话题。
想象一下,你精心打造的 Spring Boot 应用就如同一辆豪华跑车,而参数校验便是保障这辆跑车安全、高效行驶的核心部件。要是参数校验出现漏洞,那各种问题就会如潮水般涌来,让你应接不暇。所以,熟练掌握 Spring Boot 结合 Validation 封装参数校验的技巧,是你在 Java 开发之路上迈向高手境界的重要一步。
接下来,咱们详细说说这些实用技巧以及在实际项目中的应用案例。
一、引入 Validation 依赖
这是开启强大参数校验功能的第一步,就像为跑车安装先进的安全系统。在 Maven 项目的 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
添加完成后,Validation 的强大力量就准备好为你服务啦!
二、使用注解进行基本校验
Validation 提供了一系列便捷的注解,能轻松实现对参数的各种基本校验。例如,要校验用户输入的用户名不能为空且长度不超过 20 个字符,只需在对应的字段上添加 @NotBlank 和 @Size 注解:
public class User {
@NotBlank(message = "用户名不能为空")
@Size(max = 20, message = "用户名长度不能超过 20 个字符")
private String username;
// 其他字段和方法
}
当调用包含这个 User 对象的接口时,若用户名不符合校验规则,Spring Boot 会自动抛出异常,告知参数校验未通过,是不是特别方便呢?
三、自定义校验注解
有时,Validation 的基本注解可能无法满足特殊需求,这时就需要自定义校验注解啦。比如,要校验用户输入的手机号码是否符合格式,可以按以下步骤实现:
步骤 1:创建自定义注解类
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhone {
String message() default "手机号码格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
步骤 2:编写对应的校验器类
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
private static final String PHONE_REGEX = "^1[3-9]\\d{9}#34;;
@Override
public void initialize(ValidPhone constraintAnnotation) {
}
@Override
public boolean isValid(String phone, ConstraintValidatorContext context) {
return phone!= null && phone.matches(PHONE_REGEX);
}
}
现在,就可以在实体类中使用这个自定义注解啦:
public class User {
@ValidPhone
private String phone;
// 其他字段和方法
}
四、分组校验
不同场景下对同一参数可能有不同的校验规则,分组校验就能很好地应对这种情况。比如在用户注册和修改信息时,对用户名的校验规则可能不同,注册时要求不能为空,修改时则允许为空。
实现步骤如下:
步骤 1:定义校验组接口
public interface RegistrationGroup {
}
public interface UpdateGroup {
}
步骤 2:在字段上指定校验组
public class User {
@NotBlank(message = "用户名不能为空", groups = RegistrationGroup.class)
private String username;
// 其他字段和方法
}
步骤 3:在控制器方法中指定校验组
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/register")
public String register(@Validated(RegistrationGroup.class) User user) {
// 处理用户注册逻辑
return "注册成功";
}
@PutMapping("/update")
public String update(@Validated(UpdateGroup.class) User user) {
// 处理用户修改信息逻辑
return "修改成功";
}
}
这样,在不同场景下就能根据指定的校验组进行相应的参数校验啦!
五、统一异常处理
当参数校验不通过时,Spring Boot 会抛出 MethodArgumentNotValidException 异常。为了给用户提供更友好的提示信息,我们可以统一处理这个异常。
实现步骤:
创建一个全局异常处理类,使用 @ControllerAdvice 注解标注:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result handleValidationException(MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
List<String> errorMessages = new ArrayList<>();
for (FieldError fieldError : fieldErrors) {
errorMessages.add(fieldError.getDefaultMessage());
}
return Result.error(ResultCode.PARAM_ERROR, errorMessages);
}
}
通过这个异常处理类,将参数校验不通过的错误信息封装成统一格式返回给前端,方便前端进行相应处理。
实际项目案例
案例一:电商平台的商品添加功能
在电商平台中,商品添加时需要对各项参数进行严格校验。比如商品名称不能为空且长度不超过 50 个字符,商品价格必须大于 0 ,库存数量不能为负数等。
在商品实体类中使用相应注解进行校验:
public class Product {
@NotBlank(message = "商品名称不能为空")
@Size(max = 50, message = "商品名称长度不能超过 50 个字符")
private String name;
@DecimalMin(value = "0.01", message = "商品价格必须大于 0")
private BigDecimal price;
@Min(value = 0, message = "库存数量不能为负数")
private Integer stock;
// 其他字段和方法
}
在商品添加的接口方法中,使用 @Valid 注解对传入的商品参数进行校验,确保参数符合要求。
案例二:用户注册与登录功能
对于用户注册,需要校验用户名、密码、邮箱等信息。用户名不能为空且长度在 6 - 20 个字符之间,密码必须符合复杂度要求(包含数字、字母、特殊字符,长度至少为 8 位),邮箱格式必须正确。
用户实体类的校验注解如下:
public class User {
@NotBlank(message = "用户名不能为空")
@Size(min = 6, max = 20, message = "用户名长度必须在 6 - 20 个字符之间")
private String username;
@Pattern(regexp = "^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[@#$%^&+=]).{8,}#34;, message = "密码必须包含数字、字母和特殊字符,长度至少为 8 位")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
// 其他字段和方法
}
在用户注册和登录的接口方法中,同样借助 @Valid 注解进行参数校验。
案例三:在线预约系统
在线预约系统中,用户预约服务时,需要对预约时间、预约人数等参数进行校验。预约时间必须在当前时间之后,预约人数不能超过服务可容纳的最大人数。
预约实体类中的校验注解如下:
public class Appointment {
@Future(message = "预约时间必须在当前时间之后")
private LocalDateTime appointmentTime;
@Max(value = 100, message = "预约人数不能超过 100 人")
private Integer numberOfPeople;
// 其他字段和方法
}
通过在预约实体类中添加校验注解,并在预约接口方法中进行参数校验,保证系统能够正确处理用户输入的预约信息。
小伙伴们,Spring Boot 结合 Validation 封装参数校验在实际项目中的应用是不是很广泛且实用呢?掌握这些技巧,不仅能提高开发效率,还能让你的系统更加稳定可靠,提升用户体验。你在实际项目开发中有没有运用过这些技巧呢?快来评论区分享你的经验吧!如果这篇文章对你有帮助,别忘了点赞、转发哦,让更多的小伙伴受益!
猜你喜欢
- 2025-02-03 java如何判断一个ipv6地址是否是在已使用的地址段中?
- 2025-02-03 xml 配置文件规范 校验(xml格式要求)
- 2025-02-03 针对初学Java的小伙伴,入门时应该了解的Java基础知识
- 2025-02-03 Java 判断对象是否所有属性为空,大家觉得这样写可以吗?
- 2025-02-03 java 判断一个地理坐标是否在电子围栏 圆、矩形、多边形区域内
- 2025-02-03 java 判断Date是上午还是下午(java判断日期是否是当天)
- 2025-02-03 java服务-springboot拦截器实现用户登录Token及权限校验
- 2025-02-03 为什么阿里强制 boolean 类型变量不能使用 is 开头?你造吗
- 2025-02-03 还在为临时查找SpringBoot参数校验烦恼吗?收下这一篇就够了
- 2025-02-03 Java判断Integer相等-应该这么这样用
你 发表评论:
欢迎- 07-10动漫人物像|插画 壁纸 头像 签名 素材
- 07-10运动人物|插画 壁纸 头像 签名 素材
- 07-10动漫人物|插画 壁纸 头像 签名 素材
- 07-10神话人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物像|插画 壁纸 头像 签名 素材
- 07-10 日漫人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物风|插画 壁纸 头像 签名 素材
- 07-10日漫人物|插画 壁纸 头像 签名 素材
- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)