Spring Boot 注解探秘:@Validated 开启数据验证之旅(上)

在 Java Web项目开发中,数据验证是一项至关重要的环节。Spring框架中的@Validated注解为我们提供了一种方便而强大的方式来实现数据验证。本文将详细介绍 @Validated 注解的用法及其在 Spring Boot 应用中的实践。

一、基本介绍

@Validated是 Spring 框架提供的用于数据验证的注解。它可用于方法参数、方法返回值以及类上。在基于SpringBoot开发的微服务项目中,类和方法上使用的频次是最高的。

二、常用规则

@Validated注解通常与Java Bean Validation API(如 Hibernate Validator)一起使用,来定义验证规则。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

以下是一些常用的验证规则。

1. 非空校验

  • @NotNull:用于验证对象是否为null。
  • @NotEmpty: 用于验证字符串、集合或者数组是否为null。
  • @NotBlank: 用于验证字符串是否为空且不全是空格。

这里聊聊@NotNull和@NotEmpty针对字符串处理的区别。

String s = "";
String s1;
String s2 = " ";

对于类变量s,使用@NotNull注解,不会拦截住,而使用@NotEmpty注解会拦截住,因为s.length() = 0;
对于类变量s1,默认就为null,使用@NotNull和@NotEmpty注解
都会被拦截住。
对于类变量s2,使用@NotNull和@NotEmpty注解
都不会被拦截住。因为s.length() > 0。

2. 数值范围校验

  • @Min(value = 22) 和@Max(value=35)
    这两个注解用来校验long或者int类型的值的大小。示例中的值表示不能小于22,不能大于35。刚好是程序员的黄金13年。
  • @DecimalMin(value = “0.01”)和@DecimalMax(value = “999”)
    和上面类似,不过@DecimalMin和@DecimalMax更多用于价格,库存等场景。

3. 字符串长度校验

  • @Size:用于包装类类型的长度,数组或者集合大小的校验。
    示例如下:
@Size(min = 3, max = 10)
private String userName;

@Size(min = 1, max = 3)
private List<String> phoneList;

@Size(min = 1, max = 10)
private int[] numbers;

4. 正则表达式校验

  • Pattern:用于验证字符串是否符合指定的正则表达式,常用于手机号、邮箱,密码校验等场景。示例如下。
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
private String phone;

// 常见的邮箱格式,包括用户名、@符号、域名等部分。
@Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z]{2,}$", message = "邮箱格式不正确")
private String email;

// 8-16位的密码,包含字母大小写、数字、特殊符号
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!@#$%^&*])[a-zA-Z\\d!@#$%^&*]{8,16}$", message = "密码格式不正确")
private String password;

5. 分组校验

假如,某零售品牌(某姆)有一个业务场景,需要手动录入并定期维护会员的信息。
会员的信息存储在vip_customer表中。表对应的实体类VipCustomer已经构建完成了,录入和更新都是基于该实体类来的。
录入会员信息的时候会员的手机号不能为空,更新的时候业务编码不能为空。那么,我们应该如何来设计验证规则呢?是的,大家都猜对了,采用分组。以下是示例代码。

// 1. 定义用户组
public interface CreateCustomerGroup{};
public interface UpdateCustomerGroup{};

// 2. 绑定组名和参数
public class VipCustomer{
    @NotEmpty(message="业务编码不能为空", groups = UpdateCustomerGroup.class)
	private String bizCode;
	@NotEmpty(message = "会员手机号不能为空", groups = CreateCustomerGroup.class)
	private String phone;
	……
}

// 3. 在controller层使用@Validated注解并指定验证组
@RestController
@ResquestMapping("sam/vip/customer")
public class CustomerController{

    @PutMapping("/add-customer")
	Response<?> addCustomer(@ResquestBody @Validated(CreateCustomerGroup.class) VipCustomer vipCustomer){}
	
	@PostMapping("/add-customer")
	Response<?> updateCustomer(@ResquestBody @Validated(UpdateCustomerGroup.class)  VipCustomer vipCustomer){}
}

三、总结

在SpringBoot应用中,@Validated注解通常都会与@RestControllerAdvice结合使用,以实现全局的异常处理。
当数据验证失败时,就可以捕获MethodArgumentNotValidException和ConstraintViolationException异常,并返回自定义的错误信息给客户端。

下一节我们将结合最佳实践来剖析自定义验证规则,以及全局异常处理。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值