大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。
数据永远式不可信的,不能只依赖前端进行参数校验,后端也需要做参数校验,非法伪造数据完全可以越过前端,传入非法数据进入服务端,那么数据的合法性就显得尤为重要。
在 Java 开发中,数据校验是确保数据合法性和完整性的关键步骤。为了简化数据校验的过程,Java提供了两个重要的注解:@Validated 和 @Valid,为开发者提供了一套强大的数据校验框架。本篇博客将介绍 @Validated 和 @Valid 注解的作用。
前言
大家在开发中,多多少少都有过数据校验以及各种接口入参的校验,会在 service 层写入大量的 DTO校验逻辑,而且每个 service 类都充斥着大量的校验代码,如下所示:
@Service
public class xxxxService {
public void getUserInfo (RequestDto requestDto) throws Exception {
// 对requestDto里面的参数进行校验
if(ObjectUtils.isEmpty(requestDto) || StringUtils.isEmpty(requestDto.getName)) {
throw new Exception("返回参数校验的失败信息...");
}
// 业务逻辑...
}
}
上面这还只是对其中的某个参数进行校验,如果这个 Dto 类中有十几个参数都需要进行合法性校验,那怎么办?写大量的 if 语句进行校验吗?可以是可以,但是这样代码会显得非常的不好看, 那么接下来我会介绍一下今天的两个注解进行参数校验:使用 @Validated 和 @Valid 进行数据校验。
@Validated注解的作用
@Validated 注解是 Spring 框架提供的,在 Spring 应用中通常与 @Valid 注解结合使用。它常见的用于在 Spring Controller层入口就进行数据校验。与 @Valid 注解不同的是,@Validated 注解可以标记在类或方法上。
@Valid注解的作用
@Valid 是 Java Bean Validation中最常用的注解之一。它可以应用于方法参数、方法返回值或者字段上。@Valid 的作用是告诉Java Bean Validation框架,在执行方法或操作之前,需要对被注解的对象进行数据校验。
当我们在一个方法的参数上使用 @Valid 注解时,框架会对传入该参数的对象进行校验。如果校验失败,框架会返回定义的异常信息,其中包含了校验失败的详细信息,例如字段名、校验规则等。
如何使用@Validated和@Valid进行数据校验
不废话,直接上代码
// 一般 @Validated 注解直接在controller 层进行使用,在接口请求的地方使用 @Valid 注解进行参数校验,这两个需要联合使用,如果只使用 @Valid 注解是没有用的。
@Validated
@RestController
@RequestMapping("/checkController/demo")
public interface checkController {
@PostMapping("/getUserInfo")
ResponseVO getUserInfo(@RequestBody @Valid RequestDto dto);
}
接下来看看 RequestDto 类里面校验是如何做的:可以进行非空判断、可以进行正则校验、可以进行集合的大小校验等。
@Data
public class RequestDto {
@NotBlank(message = "姓名字段不能为空,请重新输入")
private String name;
@NotBlank(message = "id不能为空,请重新输入")
private String id;
// 这里可以进行各类的正则校验
@Pattern(regexp = "0|1", message = "status状态按钮只能是0或者1,请重新输入")
private String status;
@Size(max = 1000, message = "用户列表长度最长不超过1000,请重新填写") // 默认min 为 0
private List<String> userIds;
private List<User> userList;
}
接下来介绍下嵌套校验,进行套娃式的校验:就是对象里面嵌套对象,对象再嵌套对象,如何进行对后一个对象的校验等操作,还是以上面的类为例,对最后的 userList 里面的参数进行校验:
@Data
public class RequestDto {
@NotBlank(message = "姓名字段不能为空,请重新输入")
private String name;
@NotBlank(message = "id不能为空,请重新输入")
private String id;
// 这里可以进行各类的正则校验
@Pattern(regexp = "0|1", message = "status状态按钮只能是0或者1,请重新输入")
private String status;
@Size(max = 1000, message = "用户列表长度最长不超过1000,请重新填写") // 默认min 为 0
private List<String> userIds;
// 在每个对象里面加上 @Valid 注解
private List<@Valid User> userList;
}
User类:
@Data
public class User {
private String id;
// 在每个对象里面加上 @Valid 注解
private List<@Valid Demo> list;
}
Demo类:
@Data
public class Demo {
@NotBlank(message = "id不能为空,请重新输入")
private String id;
// ... 无限套娃
}
总结
在上面笔者介绍了 @Validated 和 @Valid 注解的作用及使用方法。@Validated 注解主要用于Spring controller 层,在类或方法上进行数据校验,而 @Valid 注解则用于普通 Java 类的数据校验。这两个注解结合 Java Bean Validation 为我们提供了一种简单而强大的数据校验解决方案,帮助我们确保数据的合法性和完整性,从而增加应用程序的稳定性和可靠性。
建议在 Spring 项目中广泛使用 @Validated 和 @Valid 注解,让框架帮我们进行校验,结合Java Bean Validation的校验规则,以保证应用程序的数据处理过程安全可靠。
@Valid 注解里面有很多的校验方法,笔者在这篇博客只是简单使用里其中的一两个进行示例,具体的校验大家根据实际情况来。