ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring注解之参数校验@Validated和@Valid

2022-05-25 15:32:58  阅读:152  来源: 互联网

标签:String Spring private Valid 为空 message Validated public


详解Spring 参数验证@Validated和@Valid的区别

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准JSR-303规范),配合 BindingResult 可以直接提供参数验证结果。

在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。
但是在分组、注解地方、嵌套验证等功能上两个有所不同:
1. 分组
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

2. 注解地方
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。
@Valid:可以用在构造函数、方法和方法参数和成员属性(字段)上。
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

3. 嵌套验证

在比较两者嵌套验证时,先说明下什么叫做嵌套验证。比如我们现在有个实体叫做Item:

public class Item {
 
  @NotNull(message = "id不能为空")
  @Min(value = 1, message = "id必须为正整数")
  private Long id;
 
  @Valid // 嵌套验证必须用@Valid
  @NotNull(message = "props不能为空")
  @Size(min = 1, message = "至少要有一个属性")
  private List<Prop> props;
}

Item的成员属性props必须加上@Valid注解支持嵌套验证功能。

Item带有很多属性,如下所示:

public class Prop {
 
  @NotNull(message = "pid不能为空")
  @Min(value = 1, message = "pid必须为正整数")
  private Long pid;
 
  @NotNull(message = "vid不能为空")
  @Min(value = 1, message = "vid必须为正整数")
  private Long vid;
 
  @NotBlank(message = "pidName不能为空")
  private String pidName;
 
  @NotBlank(message = "vidName不能为空")
  private String vidName;
}

属性这个实体也有自己的验证机制,比如属性和属性值id不能为空,属性名和属性值不能为空等。

现在我们有个 ItemController 接受一个Item的入参,想要对Item进行验证,如下所示:

@RestController
public class ItemController {
 
  @RequestMapping("/item/add")
  public void addItem(@Validated Item item, BindingResult bindingResult) {
    doSomething();
  }
}

此时Item里面的props如果含有Prop的相应字段为空的情况,Spring Validation框架就会检测出来,bindingResult就会记录相应的错误。

@Validated分组校验

定义实体类

@Data
public class User {

  @NotBlank(groups = {UpdateGroup.class}, message = "id不能为空")
  private String id;

  @NotBlank(groups = {SaveGroup.class, UpdateGroup.class}, message = "姓名不能为空")
  private String name;
    
  @NotNull(message = "性别不能为空")
  private String sex;
    
  @Max(value = 20 ,message = "最大长度为20")
  private String address;
    
  @Email(message = "不满足邮箱格式")
  private String email;
    
  @AssertTrue(message = "字段为true才能通过")
  private boolean isAuth;
    
  @NotBlank(message = "手机号不能为空")
  @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
  private String mobile;
    
  @Future(message = "时间在当前时间之后才可以通过")
  private Date date;


  // 新增时校验,继承Default类表示会包含没有分组的校验
  public interface SaveGroup extends Default {
  }
  // 修改时校验
  public interface UpdateGroup extends Default {
  }

}

controller 接口中使用 @Validated(groups) 设置了 groups 属性。
只有配置 groups = User.SaveGroup.class 的效验注解才会生效。
没有设置 groups 属性,则所有效验注解都会生效。

@RestController(value = "/user")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 新增用户
     * @param user
     * @return
     */
    @RequestMapping("/insert")
    @ResponseBody
    public User insert(@RequestBody @Validated(User.SaveGroup.class) User user){
        return userService.insert(user);
    }

    /**
     * 修改用户
     * @param user
     * @return
     */
    @RequestMapping("/update")
    @ResponseBody
    public boolean update(@RequestBody @Validated(User.UpdateGroup.class) User user){
        return userService.update(user);
    }

}

对Controller里的方法的多个参数进行校验

对Controller里的方法的多个参数进行校验(扁平化参数):在Controller类上加注解@Validated

@RestController
@RequestMapping
@Validated
public class HelloController {
    @PutMapping("/hello/id/{id}/status/{status}")
    public Object helloGet(@Max(5) @PathVariable Integer id, @Min(5) @PathVariable Integer status) {
        return "hello world";
    }
}

@NotEmpty、@NotNull、@NotBlank的区别

  • @NotNull :不能为null,但可以为empty,没有Size的约束,带注释的元素不能为null。接受任何类型。一般用在Integer、Double等基本数据类型的非空校验上,使用** @size、@Max、@Min **对字段数值进行大小的控制。

  • @NotEmpty:不能为null,且Size>0,@NotEmpty注解的String、Collection、Map、数组是不能为null或长度为0

  • @NotBlank:只用于String,不能为null且trim()之后size>0,纯空格的String也是不符合规则的,此注解只能用于验证String类型

标签:String,Spring,private,Valid,为空,message,Validated,public
来源: https://www.cnblogs.com/zhaojinhui/p/16309428.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有