0


《SpringBoot篇》12.@Valid与@Validated的区别

陈老老老板

说明:工作了,学习一些新的技术栈,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。

1.介绍

说明: 其实@Valid 与 @Validated都是做数据校验的,只不过注解位置与用法有点不同。

不同点:
(1)
@Valid是使用Hibernate validation的时候使用。@Validated是只用Spring Validator校验机制使用。

(2)
@Valid 可以嵌套验证
@Validation 不能进行嵌套验证

(3)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上。
@Validated:用在类、方法和方法参数上。但不能用于成员属性(field)。
(如果@Validated注解在成员属性上,则会报不适用于field的错误。)

(4)
@Valid:没有分组功能。
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制。

2.用法

(1)@Valid用法

a.导入依赖

SpringBoot项目:

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version></dependency>

b.使用前提是实体类中属性使用注解进行校验

packagecom.example.demo.pojo;importlombok.Data;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.NotBlank;importorg.hibernate.validator.constraints.Range;importorg.springframework.format.annotation.DateTimeFormat;importjavax.persistence.*;importjavax.validation.constraints.NotNull;importjava.io.Serializable;importjava.util.Date;//lombok@DatapublicclassUserimplementsSerializable{//用户名@NotBlank(message ="请输入名称")@Length(message ="名称不能超过个 {max} 字符", max =10)privateString username;//年龄@NotNull(message ="请输入年龄")@Range(message ="年龄范围为 {min} 到 {max} 之间", min =1, max =100)privateString age;}

c.在Controller方法参数中加上@Valid注解

packagecom.example.demo.controller;importcom.example.demo.pojo.User;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.validation.BindingResult;importorg.springframework.validation.ObjectError;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;importjavax.validation.Valid;importjava.util.List;@RestControllerpublicclassUserController{publicstaticfinalLogger logger =LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBodypublicStringadd(@ValidatedUser user,BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return"添加失败";}return"添加成功";}}

经过测试填写错误数据,会在控制台输出报错信息。
在这里插入图片描述
在这里插入图片描述

(2)@Validated用法

a.开启校验框架(与上面一样)

<!--1.导入JSR303规范--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency><!--使用hibernate框架提供的校验器做实现--><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>

c.在需要开启校验功能的类上使用注解@Validated开启校验功能,对具体的字段设置校验规则,这里讲的是可以在类上使用@Validated注解,配合xml数据绑定。

@Component@Data@ConfigurationProperties(prefix ="servers")//开启对当前bean的属性注入校验@ValidatedpublicclassServerConfig{//设置具体的规则@Max(value =8888,message ="最大值不能超过8888")@Min(value =202,message ="最小值不能低于202")privateint port;}

(3)@Validated实现分组校验

注意 分组校验就是把条件加入组中,可以自由选择开启那些组的校验方式。

a.分组接口

packagecom.example.demo.pojo;publicinterfaceGroup{interfaceUpdate{};interfaceFindAll{};}

b.实体类

packagecom.example.demo.pojo;importlombok.Data;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.NotBlank;importorg.hibernate.validator.constraints.Range;importorg.springframework.format.annotation.DateTimeFormat;importjavax.persistence.*;importjavax.validation.constraints.NotNull;importjava.io.Serializable;importjava.util.Date;//lombok@DatapublicclassUserimplementsSerializable{//用户名@NotBlank(message ="请输入用户名不能为空",groups ={Group.FindAll.class})@Length(message ="名称不能超过个 {max} 字符", max =10,groups ={Group.FindAll.class})privateString username;//年龄@NotBlank(message ="请输入年龄不能为空",groups ={Group.Update.class})@Range(message ="年龄范围为 {min} 到 {max} 之间", min =1, max =100,groups ={Group.Update.class})privateString age;}

c.controller接口:

注意 @Validated有参数 value中写分组名称

packagecom.example.demo.controller;importcom.example.demo.pojo.Group;importcom.example.demo.pojo.User;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.validation.BindingResult;importorg.springframework.validation.ObjectError;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;importjavax.validation.Valid;importjava.util.List;@RestControllerpublicclassUserController{publicstaticfinalLogger logger =LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBody//注意@Validated有参数 value中写分组名称publicStringadd(@Validated(value ={Group.Update.class})User user,BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return"添加失败";}return"添加成功";}}

(4)@Valid 实现嵌套校验

注: 嵌套检测就是在一个User类中,存在另外一个User2类的属性。嵌套检测User同时也检测User2。

a.实体类User

packagecom.example.demo.pojo;importlombok.Data;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.NotBlank;importorg.hibernate.validator.constraints.Range;importorg.springframework.format.annotation.DateTimeFormat;importjavax.persistence.*;importjavax.validation.Valid;importjavax.validation.constraints.NotNull;importjava.io.Serializable;importjava.util.Date;//lombok@DatapublicclassUserimplementsSerializable{//用户名@NotBlank(message ="请输入用户名不能为空1")privateString username;//年龄@NotBlank(message ="请输入年龄不能为空1")privateString age;@Valid@NotNull(message ="user2不能为空1")privateUser2 user2;}}

b.实体类User2

packagecom.example.demo.pojo;importlombok.Data;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.NotBlank;importorg.hibernate.validator.constraints.Range;importorg.springframework.format.annotation.DateTimeFormat;importjavax.persistence.*;importjavax.validation.Valid;importjavax.validation.constraints.NotNull;importjava.io.Serializable;importjava.util.Date;packagecom.example.demo.pojo;importlombok.Data;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.Range;importjavax.validation.constraints.NotNull;importjava.io.Serializable;//lombok@DatapublicclassUser2implementsSerializable{//用户名@Length(message ="名称不能超过个 {max} 字符2", max =10)privateString username2;//年龄@Range(message ="年龄范围为 {min} 到 {max} 之间2", min =1, max =100)privateString age2;}

c.Controller类(这里使用@Valid)

packagecom.example.demo.controller;importcom.example.demo.pojo.Group;importcom.example.demo.pojo.User;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.validation.BindingResult;importorg.springframework.validation.ObjectError;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.RestController;importjavax.validation.Valid;importjava.util.List;@RestControllerpublicclassUserController{publicstaticfinalLogger logger =LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBodypublicStringadd(@ValidUser user,BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return"添加失败";}return"添加成功";}}

**总结:了解这两个注解可以让你的校验数据更加方便。希望对您有帮助,感谢阅读

结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。**


本文转载自: https://blog.csdn.net/weixin_47343544/article/details/127146089
版权归原作者 陈老老老板 所有, 如有侵权,请联系我们删除。

“《SpringBoot篇》12.@Valid与@Validated的区别”的评论:

还没有评论