做Web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式的非空校验,规则校验都是必不可少的。如果参数比较少的话还是容易的无伤大雅 但参数比较多了的话代码中就会出现大量的if-else就比如下面这样:
可以看出这只是几个字段的校验,而且只是判是否非空,如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下@Validated通过注解的方式进行校验参数
Springboot优雅的进行字段校验
小小知识点:一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.7.4</version>
</dependency>
常用注解说明
案例
在实体类对需要校验的属性加上对应的注解
message:不符合要求后提示的信息
groups:分组校验数据(在下面会有解释)
public class User implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
@NotNull(message = "ID不能为空", groups = {User.Update.class})
private Integer id;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空", groups = {User.Insert.class, User.Update.class})
@Length(min = 2, max = 14, message = "姓名过短或过长", groups = {User.Insert.class, User.Update.class})
private String pname;
/**
* 性别(男:1;女:2;)
*/
@NotBlank(message = "性别不能为空", groups = {User.Insert.class, User.Update.class})
@Length(min = 1, max = 2, message = "性别错误", groups = {User.Insert.class, User.Update.class})
private String psex;
/**
* 年龄
*/
@NotBlank(message = "年龄不能为空", groups = {User.Insert.class, User.Update.class})
@Pattern(regexp = "[0-9]+", message = "年龄不合法", groups = {User.Insert.class, User.Update.class})
private String pages;
public interface Insert {}
public interface Update {}
Controller层
@Validated(User.Update.class):只校验Update组的参数
@PostMapping(value = "/updateTest")
public void updateTest(@Validated(User.Update.class) @RequestBody User user) {
userService.updateById(user);
}
groups分组校验(解释)
根据上面实体类举例说明:
通过groups的属性来分组,假如是添加方法那么是不需要ID的,而是姓名、性别、年龄不能为空,但如果是修改方法肯定需要ID,所以实体类ID参数分组只设置了是Update方法才会校验ID参数是否为空
单参数校验
注意:单参数校验一定要在Controller层的类名上加@Validated注解,不然校验不会生效
@RequestMapping("/user")
@Validated public class UserController {
@RequestMapping("/getById")
public User getById(@NotNull(message = "id不能为空") Integer id) {
System.out.println(id);
}
}
嵌套校验
实体类中包含了一个用户集合,如果需要校验集合内User对象属性参数的话,需要加上@Valid注解
public class UserVo implements Serializable {
@NotBlank(message = "部门名称不能为空", groups = {User.Insert.class})
private String deptName;
@Size(min = 1, message = "用户不能为空", groups = {User.Insert.class})
@Valid
private List<User> userList;
}
Controlller层
Controller层也需要加上@Valid注解
@RequestMapping(value = "/save", method = RequestMethod.POST)
public void save(@Validated(User.Insert.class) @Valid @RequestBody UserVo vo) {
userService.save(vo);
}
原文链接:https://blog.csdn.net/weixin_47324958/article/details/127900050