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

作者:陈老老老板 时间:2021-08-07 21:38:41 

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.使用前提是实体类中属性使用注解进行校验

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

//用户名
   @NotBlank(message = "请输入名称")
   @Length(message = "名称不能超过个 {max} 字符", max = 10)
   private String username;

//年龄
   @NotNull(message = "请输入年龄")
   @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)
   private String age;
}

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

package com.example.demo.controller;

import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

@PostMapping("/add")
   @ResponseBody
   public String add(@Validated User user, BindingResult bindingResult){
       if(bindingResult.hasErrors()){
           List<ObjectError> allErrors = bindingResult.getAllErrors();
           allErrors.forEach( v ->{
               logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
           });
           return "添加失败";
       }
       return "添加成功";
   }
}

经过测试填写错误数据,会在控制台输出报错信息。

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

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

(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的属性注入校验
@Validated
public class ServerConfig {
   //设置具体的规则
   @Max(value = 8888,message = "最大值不能超过8888")
   @Min(value = 202,message = "最小值不能低于202")
   private int port;
}

(3)@Validated实现分组校验

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

a.分组接口

package com.example.demo.pojo;
public interface Group {
   interface Update{};
   interface FindAll{};
}

b.实体类

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

//用户名
   @NotBlank(message = "请输入用户名不能为空",groups = {Group.FindAll.class})
   @Length(message = "名称不能超过个 {max} 字符", max = 10 ,groups = {Group.FindAll.class})
   private String username;

//年龄
   @NotBlank(message = "请输入年龄不能为空",groups = {Group.Update.class})
   @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100,groups = {Group.Update.class})
   private String age;
}

c.controller接口:

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

package com.example.demo.controller;

import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

@PostMapping("/add")
   @ResponseBody
   //注意@Validated有参数 value中写分组名称
   public String add(@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

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

//用户名
   @NotBlank(message = "请输入用户名不能为空1")
   private String username;

//年龄
   @NotBlank(message = "请输入年龄不能为空1")
   private String age;

@Valid
   @NotNull(message = "user2不能为空1")
   private User2 user2;
}
}

b.实体类User2

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

//lombok
@Data
public class User2 implements Serializable {

//用户名
   @Length(message = "名称不能超过个 {max} 字符2", max = 10 )
   private String username2;

//年龄

@Range(message = "年龄范围为 {min} 到 {max} 之间2", min = 1, max = 100)
   private String age2;
}

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

package com.example.demo.controller;

import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

@PostMapping("/add")
   @ResponseBody
   public String add(@Valid User 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,@valid,@validated
0
投稿

猜你喜欢

  • Go&java算法之最大数示例详解

    2023-10-30 08:54:56
  • Android实现背景颜色滑动渐变效果的全过程

    2021-08-28 09:23:51
  • Java RandomAccessFile 指定位置实现文件读取与写入

    2023-06-05 17:06:25
  • Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法

    2022-03-08 17:38:23
  • SpringBoot2.0整合SpringCloud Finchley @hystrixcommand注解找不到解决方案

    2021-08-26 12:54:32
  • 浅谈Java与C#的一些细微差别

    2022-09-25 06:33:36
  • 详解Java设计模式之抽象工厂模式

    2022-09-29 17:00:34
  • android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    2023-07-17 12:12:30
  • JAVA调用SAP WEBSERVICE服务实现流程图解

    2023-11-07 03:54:57
  • C#反射内存的处理分析

    2022-04-30 00:56:22
  • C++右值引用与move和forward函数的使用详解

    2023-07-05 19:27:33
  • Java开发环境jdk 1.8安装配置方法(Win7 64位系统/windows server 2008)

    2022-05-11 20:00:58
  • spring mvc中注解@ModelAttribute的妙用分享

    2022-09-15 13:53:25
  • C#远程获取图片文件流的方法

    2023-03-17 15:15:18
  • idea 与 maven 使用过程中遇到的问题及解决方案

    2021-10-07 02:34:24
  • SpringBoot后端接口的实现(看这一篇就够了)

    2021-11-05 04:07:41
  • OpenHarmony实现类Android短信验证码及倒计时流程详解

    2021-11-14 10:55:26
  • 浅谈用java实现事件驱动机制

    2022-07-12 18:06:03
  • Java数据结构与算法之稀疏数组与队列深入理解

    2022-05-31 06:33:11
  • 详解SpringBoot迭代发布JAR瘦身配置

    2021-11-14 19:10:48
  • asp之家 软件编程 m.aspxhome.com