返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot学习篇之@Valid与@Validated的区别
  • 959
分享到

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

springboot @valid与@validated@valid @validated区别 2022-11-13 19:11:02 959人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.介绍2.用法(1)@Valid用法(2)@Validated用法(3)@Validated实现分组校验(4)@Valid 实现嵌套校验总结:1.介绍 说明: 其实@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项目

<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 "添加成功";
    }
}

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

(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 "添加成功";
    }
}

总结:

了解这两个注解可以让你的校验数据更加方便。

到此这篇关于SpringBoot学习篇之@Valid与@Validated区别的文章就介绍到这了,更多相关SpringBoot @Valid与@Validated区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot学习篇之@Valid与@Validated的区别

本文链接: https://lsjlt.com/news/170543.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot学习篇之@Valid与@Validated的区别
    目录1.介绍2.用法(1)@Valid用法(2)@Validated用法(3)@Validated实现分组校验(4)@Valid 实现嵌套校验总结:1.介绍 说明: 其实@Valid...
    99+
    2022-11-13
    springboot @valid与@validated @valid @validated区别
  • @Valid注解的作用及@Valid注解与@Validated的区别
    目录1.@Valid注解2.@Valid与@Validated的区别注解位置分组校验组序列嵌套校验1.@Valid注解 用于验证注解是否符合要求,直接加在变量user之前,在变量中添...
    99+
    2024-04-02
  • SpringBoot2学习之springboot与spring区别分析
    目录springboot与spring区别一、spring 可以做什么二、springbootSpringBoot 优点SpringBoot 缺点三、如何学习 springboot文...
    99+
    2024-04-02
  • spring注解之@Valid和@Validated的区分总结
    目录@Valid:@Validated:1、分组2、组序列3、验证多个对象补充:主要区别总结@Valid: @Valid注解用于校验,所属包为:javax.validation.Va...
    99+
    2024-04-02
  • Python学习之.iloc与.loc的区别、联系和用法
    目录1.联系2.区别3.用法3.1行列全为从0开始顺序编号3.2有一行或列不是从0顺序编号3.3行或者列为非数字标签3.4 其他用法总结最近接触到数据科学,需要对一些数据表进行分析,...
    99+
    2024-04-02
  • 机器学习与深度学习的区别有哪些
    机器学习和深度学习是两个相关但不完全相同的概念。以下是它们之间的一些区别:1. 概念:机器学习是一种广义的概念,指的是机器通过学习数...
    99+
    2023-09-21
    机器学习 深度学习
  • SwiftUI学习之state和Binding的区别浅析
    @state 绑定值的状态,其属性的修饰官方推荐使用private.上代码(ps:这里没用private 进行修饰,是为了演示区别) import SwiftUI struct ...
    99+
    2024-04-02
  • SpringBoot与Spring之间有什么区别
    SpringBoot和Spring是两个不同的项目,但是它们之间也有一些相关性。Spring是一个全功能的框架,用于构建企业级应用程...
    99+
    2024-04-09
    SpringBoot Spring
  • Spring和SpringBoot之间的区别
    目录Spring是什么? Spring Boot是什么? Maven依赖项 springboot为不同的Spring模块提供了许多启动程序依赖项。最常用的方法有:MVC配置 配置模板...
    99+
    2024-04-02
  • Oracle学习篇之SQL语句的优化
    Oracle学习篇之SQL语句的优化①在使用SELECT语句查询时,不要用“*”代替所有列名,因为这样的写法对Oracle系统来说会存在解析的动态问题。Oracle系统会通过查询数据字典来将“*”转...
    99+
    2024-04-02
  • python之 * 与** 的区别
    1.计算方面:*表示乘法       **表示指数幂运算 2.作为函数的参数: 1)调用函数时假设有函数 def test(a, b, c) test(*args):*表示传入的参数args是一个元组,把元组中的每一个元素按照次序作为参数...
    99+
    2023-01-30
    区别 python
  • JAVA学习进阶篇之时间与日期相关类
    目录Date类毫秒值的概念与作用构造方法无参构造有参构造成员方法getTime()currentTimeMillis方法DateFormat和SimpleDateFormat类构造方...
    99+
    2024-04-02
  • 详解Springboot之Logback的使用学习
    目录一、导入依赖二、配置文件解析三、配置文件结构四、各个组件的作用五、Logger组件六、logger属性七、Appender组件一、导入依赖 普通项目 <dependen...
    99+
    2024-04-02
  • 深度学习和机器学习的区别是什么
    深度学习是机器学习的一个分支,其主要区别在于模型的复杂性和层次结构。深度学习使用多层神经网络来学习复杂的特征,而机器学习通常使用较简...
    99+
    2024-04-02
  • 机器学习与数据挖掘的区别有哪些
    机器学习和数据挖掘是两个相关但又不完全相同的概念。以下是它们之间的主要区别:1. 定义和目标:机器学习是一种通过让计算机系统学习数据...
    99+
    2023-09-21
    机器学习 数据挖掘
  • Mahout与传统机器学习库的区别有哪些
    Mahout是一个开源的分布式机器学习库,主要用于处理大规模数据集。与传统的机器学习库相比,Mahout具有以下几个特点: 分布...
    99+
    2024-04-02
  • python机器学习高数篇之函数极限与导数
    目录函数极限函数极限练习题.1函数极限练习题.2导数python求导数的三种写法方法一方法二方法三不知道大家有没有类似的经历,斗志满满地翻开厚厚的机器学习书,很快被一个个公式炸蒙了。...
    99+
    2024-04-02
  • Python之is与==的区别
    首先看几个例子:# -*-coding=utf-8 -*- a="Hello Python" b="Hello Python" print (a is b)    #结果是:True print (a == b)    #结果是:True ...
    99+
    2023-01-31
    区别 Python
  • 浅谈springboot@Repository与@Mapper的区别
    目录1、@Repository2、@Mapper3、区别相同点:不同点:4、解决使用@mapper接口时,注入mapper爆红问题今天在用springboot整合mybatis时,m...
    99+
    2024-04-02
  • SpringBoot学习之基于注解的缓存
    目录主要使用到的注解:使用步骤注解属性介绍@Cacheable() 的属性值及释义:@CachPut属性值及释义:@CachEvict属性值及释义:@Caching总结主要使用到的注...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作