转载

SpringBoot 使用@Validated实现参数校验

做Web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式的非空校验,规则校验都是必不可少的。如果参数比较少的话还是容易的无伤大雅 但参数比较多了的话代码中就会出现大量的if-else就比如下面这样: 16794531076708 可以看出这只是几个字段的校验,而且只是判是否非空,如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下@Validated通过注解的方式进行校验参数

Springboot优雅的进行字段校验

小小知识点:一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验。

引入依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
 <version>2.7.4</version>
</dependency>
常用注解说明 20200913110853722

案例

在实体类对需要校验的属性加上对应的注解 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
正文到此结束
Loading...