@Valid和@Validated的区别

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 @Valid和@Validated的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、数据校验

  • 前端校验
  • 即在页面中使用JS校验表单中用户输入的参数是否合法,如失焦后校验、表单提交时校验…
  • 后端校验
  • Controller层校验:校验从前端接收到的参数是否合法
  • Service层:一般校验业务逻辑,也可校验参数
  • Mapper层:一般不校验

写到这里,某天吃饭突然想到关于controller层、Service层、Mapper层数据校验的一个形象比喻:你去面馆吃面,Controller层就像一个点餐自助机器,这里校验的是你想吃的面这里有没有卖的(类比参数合法性校验)。点餐自助机旁的工作人员,会看你扫码支付的钱有没有少给(类比Service层方法,校验业务逻辑)。如果都没有问题,则工作人员将你点的单子传给后厨(类比Mapper层),来做你想吃的面(类比增删改查的mapper方法),而你在自助点餐机上点的"牛肉面、不要香菜、二细"就像一个dto对象,最后端给你一碗面(返回一个调用结果),这个碗,就像是一个和前端约定好的结果抽象类,里面装了牛肉面(类比结果类封装了你查到的数据)

在这里插入图片描述


3、@Valid和@Validated

对比项 @Valid @Validated
提供者 JSR-303规范 Spring
可标注位置 方法、方法参数和成员属性(字段)、构造函数 方法、方法参数和类型
是否支持分组 不支持 支持
是否支持嵌套校验 支持 不支持
共性 开启参数校验 开启参数校验

关于JSR-303的一些介绍在文末.

4、分组校验

当多个接口使用同一个模型类,如新增课程和修改课程接口,都使用AddCourseDto类,而它们对同一个参数的校验规则不一样,此时就需要分组校验:

  • 定义空接口表示不同的分组
 /**
 * @description 校验分组
 */
public class ValidationGroups {

 public interface Inster{};
 public interface Update{};
 public interface Delete{};

}


  • 定义规则是指定分组, 即加groups属性
@NotEmpty(groups = {ValidationGroups.Inster.class},message = "添加课程名称不能为空")

@NotEmpty(groups = {ValidationGroups.Update.class},message = "修改课程名称不能为空")
// @NotEmpty(message = "课程名称不能为空")
 @ApiModelProperty(value = "课程名称", required = true)
 private String name;

  • 在controller层中启动参数校验时也要指定用哪个分组的规则
...

@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){

...

注意: 这里想实现这种分组校验的效果, 就只能@Validated

5、嵌套校验

嵌套校验用在要校验的属性是一个实体类属性时:

public classn Person{
	@NotBlank
	private String name;
	@NotEmpty
	private List<Pet> petList; //宠物类属性
}
//宠物实体类
public class Pet{
	@Min(value = 1)
	private Integer age;
	@NotBlank
	private String name;
}

controller层开启校验:

@GetMapping("/getInfo")
public Object getInfo(@Valid Person person){
	...
}

此时: 不管在controller层用@Valid还是@Validated, 都是只校验Person类中的@NotBlank和@NotEmpty, 而宠物属性中的age属性的@Min和name属性的@NotBlank不会被校验

public classn Person{
	@NotBlank
	private String name;
	@Valid   //!!!注意这里
	@NotEmpty
	private List<Pet> petList; //宠物类属性
}

给实体类属性加了@Valid注解, 实体类属性中的属性就会被校验, 而@Validated注解不能用于注解, 此时就只能用@Valid


总结:

  • 你要只是在controller层开启参数校验, 两个用哪个都行
  • 要实现分组校验, 只能@Validated
  • 要实现嵌套校验, 只能@Valid

7、Java数据校验:JSR-303

最后整理下JSR-303、JSR-349、validation-api、hibernate-validator、Spring之间的关系:

  • SR-303是一项标准、一项规范,JSR-349是其升级版本,添加了一些新特性。它们规定一些校验规范即校验注解如@Null、@NotNull、@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现,说白了就是一堆接口没有实现类,这堆接口放在validation-api.jar中
    在这里插入图片描述

  • hibernate-validator.jar是对这个规范的实现,并增加了一些其他校验注解,如@Length、@Range等,位于org.hibernate.validator.constraints包下
    在这里插入图片描述

  • Spring为了给开发者提供便捷,对hibernate-validator.jar进行了二次封装,让数据校验更加便捷、提供了一些新功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146063.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!