[JAVA] SpringBoot学习篇之@Valid与@Validated的区别

2234 0
黑夜隐士 2022-11-8 16:52:09 | 显示全部楼层 |阅读模式
目录

    1.介绍2.用法
      (1)@Valid用法(2)@Validated用法(3)@Validated实现分组校验(4)@Valid 实现嵌套校验
    总结:


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项目:
  1. <dependency>
  2.     <groupId>javax.validation</groupId>
  3.     <artifactId>validation-api</artifactId>
  4.     <version>1.1.0.Final</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.hibernate</groupId>
  8.     <artifactId>hibernate-validator</artifactId>
  9.     <version>5.4.1.Final</version>
  10. </dependency>
复制代码
b.使用前提是实体类中属性使用注解进行校验
  1. package com.example.demo.pojo;
  2. import lombok.Data;
  3. import org.hibernate.validator.constraints.Length;
  4. import org.hibernate.validator.constraints.NotBlank;
  5. import org.hibernate.validator.constraints.Range;
  6. import org.springframework.format.annotation.DateTimeFormat;
  7. import javax.persistence.*;
  8. import javax.validation.constraints.NotNull;
  9. import java.io.Serializable;
  10. import java.util.Date;
  11. //lombok
  12. @Data
  13. public class User implements Serializable {
  14.     //用户名
  15.     @NotBlank(message = "请输入名称")
  16.     @Length(message = "名称不能超过个 {max} 字符", max = 10)
  17.     private String username;
  18.     //年龄
  19.     @NotNull(message = "请输入年龄")
  20.     @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)
  21.     private String age;
  22. }
复制代码
c.在Controller方法参数中加上@Valid注解
  1. package com.example.demo.controller;
  2. import com.example.demo.pojo.User;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.validation.BindingResult;
  6. import org.springframework.validation.ObjectError;
  7. import org.springframework.validation.annotation.Validated;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.RequestBody;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import org.springframework.web.bind.annotation.RestController;
  12. import javax.validation.Valid;
  13. import java.util.List;
  14. @RestController
  15. public class UserController {
  16.     public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());
  17.     @PostMapping("/add")
  18.     @ResponseBody
  19.     public String add(@Validated User user, BindingResult bindingResult){
  20.         if(bindingResult.hasErrors()){
  21.             List<ObjectError> allErrors = bindingResult.getAllErrors();
  22.             allErrors.forEach( v ->{
  23.                 logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
  24.             });
  25.             return "添加失败";
  26.         }
  27.         return "添加成功";
  28.     }
  29. }
复制代码
经过测试填写错误数据,会在控制台输出报错信息。





(2)@Validated用法

a.开启校验框架(与上面一样)
  1. <!--1.导入JSR303规范-->
  2. <dependency>
  3.     <groupId>javax.validation</groupId>
  4.     <artifactId>validation-api</artifactId>
  5. </dependency>
  6. <!--使用hibernate框架提供的校验器做实现-->
  7. <dependency>
  8.     <groupId>org.hibernate.validator</groupId>
  9.     <artifactId>hibernate-validator</artifactId>
  10. </dependency>
复制代码
c.在需要开启校验功能的类上使用注解@Validated开启校验功能,对具体的字段设置校验规则,这里讲的是可以在类上使用@Validated注解,配合xml数据绑定。
  1. @Component
  2. @Data
  3. @ConfigurationProperties(prefix = "servers")
  4. //开启对当前bean的属性注入校验
  5. @Validated
  6. public class ServerConfig {
  7.     //设置具体的规则
  8.     @Max(value = 8888,message = "最大值不能超过8888")
  9.     @Min(value = 202,message = "最小值不能低于202")
  10.     private int port;
  11. }
复制代码
(3)@Validated实现分组校验

注意 分组校验就是把条件加入组中,可以自由选择开启那些组的校验方式。
a.分组接口
  1. package com.example.demo.pojo;
  2. public interface Group {
  3.     interface Update{};
  4.     interface FindAll{};
  5. }
复制代码
b.实体类
  1. package com.example.demo.pojo;
  2. import lombok.Data;
  3. import org.hibernate.validator.constraints.Length;
  4. import org.hibernate.validator.constraints.NotBlank;
  5. import org.hibernate.validator.constraints.Range;
  6. import org.springframework.format.annotation.DateTimeFormat;
  7. import javax.persistence.*;
  8. import javax.validation.constraints.NotNull;
  9. import java.io.Serializable;
  10. import java.util.Date;
  11. //lombok
  12. @Data
  13. public class User implements Serializable {
  14.     //用户名
  15.     @NotBlank(message = "请输入用户名不能为空",groups = {Group.FindAll.class})
  16.     @Length(message = "名称不能超过个 {max} 字符", max = 10 ,groups = {Group.FindAll.class})
  17.     private String username;
  18.     //年龄
  19.     @NotBlank(message = "请输入年龄不能为空",groups = {Group.Update.class})
  20.     @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100,groups = {Group.Update.class})
  21.     private String age;
  22. }
复制代码
c.controller接口:
注意 @Validated有参数 value中写分组名称
  1. package com.example.demo.controller;
  2. import com.example.demo.pojo.Group;
  3. import com.example.demo.pojo.User;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.validation.BindingResult;
  7. import org.springframework.validation.ObjectError;
  8. import org.springframework.validation.annotation.Validated;
  9. import org.springframework.web.bind.annotation.PostMapping;
  10. import org.springframework.web.bind.annotation.RequestBody;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import javax.validation.Valid;
  14. import java.util.List;
  15. @RestController
  16. public class UserController {
  17.     public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());
  18.     @PostMapping("/add")
  19.     @ResponseBody
  20.     //注意@Validated有参数 value中写分组名称
  21.     public String add(@Validated(value = {Group.Update.class}) User user, BindingResult bindingResult){
  22.         if(bindingResult.hasErrors()){
  23.             List<ObjectError> allErrors = bindingResult.getAllErrors();
  24.             allErrors.forEach( v ->{
  25.                 logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
  26.             });
  27.             return "添加失败";
  28.         }
  29.         return "添加成功";
  30.     }
  31. }
复制代码
(4)@Valid 实现嵌套校验

注: 嵌套检测就是在一个User类中,存在另外一个User2类的属性。嵌套检测User同时也检测User2。
a.实体类User
  1. package com.example.demo.pojo;
  2. import lombok.Data;
  3. import org.hibernate.validator.constraints.Length;
  4. import org.hibernate.validator.constraints.NotBlank;
  5. import org.hibernate.validator.constraints.Range;
  6. import org.springframework.format.annotation.DateTimeFormat;
  7. import javax.persistence.*;
  8. import javax.validation.Valid;
  9. import javax.validation.constraints.NotNull;
  10. import java.io.Serializable;
  11. import java.util.Date;
  12. //lombok
  13. @Data
  14. public class User implements Serializable {
  15.     //用户名
  16.     @NotBlank(message = "请输入用户名不能为空1")
  17.     private String username;
  18.     //年龄
  19.     @NotBlank(message = "请输入年龄不能为空1")
  20.     private String age;
  21.     @Valid
  22.     @NotNull(message = "user2不能为空1")
  23.     private User2 user2;
  24. }
  25. }
复制代码
b.实体类User2
  1. package com.example.demo.pojo;
  2. import lombok.Data;
  3. import org.hibernate.validator.constraints.Length;
  4. import org.hibernate.validator.constraints.NotBlank;
  5. import org.hibernate.validator.constraints.Range;
  6. import org.springframework.format.annotation.DateTimeFormat;
  7. import javax.persistence.*;
  8. import javax.validation.Valid;
  9. import javax.validation.constraints.NotNull;
  10. import java.io.Serializable;
  11. import java.util.Date;
  12. package com.example.demo.pojo;
  13. import lombok.Data;
  14. import org.hibernate.validator.constraints.Length;
  15. import org.hibernate.validator.constraints.Range;
  16. import javax.validation.constraints.NotNull;
  17. import java.io.Serializable;
  18. //lombok
  19. @Data
  20. public class User2 implements Serializable {
  21.     //用户名
  22.     @Length(message = "名称不能超过个 {max} 字符2", max = 10 )
  23.     private String username2;
  24.     //年龄
  25.     @Range(message = "年龄范围为 {min} 到 {max} 之间2", min = 1, max = 100)
  26.     private String age2;
  27. }
复制代码
c.Controller类(这里使用@Valid)
  1. package com.example.demo.controller;
  2. import com.example.demo.pojo.Group;
  3. import com.example.demo.pojo.User;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.validation.BindingResult;
  7. import org.springframework.validation.ObjectError;
  8. import org.springframework.validation.annotation.Validated;
  9. import org.springframework.web.bind.annotation.PostMapping;
  10. import org.springframework.web.bind.annotation.RequestBody;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import javax.validation.Valid;
  14. import java.util.List;
  15. @RestController
  16. public class UserController {
  17.     public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());
  18.     @PostMapping("/add")
  19.     @ResponseBody
  20.     public String add(@Valid User user, BindingResult bindingResult){
  21.         if(bindingResult.hasErrors()){
  22.             List<ObjectError> allErrors = bindingResult.getAllErrors();
  23.             allErrors.forEach( v ->{
  24.                 logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
  25.             });
  26.             return "添加失败";
  27.         }
  28.         return "添加成功";
  29.     }
  30. }
复制代码
总结:

了解这两个注解可以让你的校验数据更加方便。
到此这篇关于SpringBoot学习篇之@Valid与@Validated区别的文章就介绍到这了,更多相关SpringBoot @Valid与@Validated区别内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行