陈老老老板
说明:工作了,学习一些新的技术栈,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。
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"添加成功";}}
**总结:了解这两个注解可以让你的校验数据更加方便。希望对您有帮助,感谢阅读
结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。**
版权归原作者 陈老老老板 所有, 如有侵权,请联系我们删除。