java 实体常用校验注解方法

news2024/9/23 16:09:29

1、常用注解:

注解说明
@Null只能为null
@NotNull(message = “id不能为空”)必须不为null,可以为空字符串
@Min(value)必须为一个不小于指定值的数字
@Max(value)必须为一个不大于指定值的数字
@NotBlank(message = “姓名不能为空”)验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@AssertFalse必须为false
@AssertTrue必须为true
@DecimalMax(value)必须为一个不大于指定值的数字
@DecimalMin(value)必须为一个不小于指定值的数字
@Digits(integer,fraction)必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future必须是一个将来的日期
@Past必须是一个过去的日期
@Pattern(regexp = “^(正则表达式)$”, message = “身份证格式错误”)必须符合指定的正则表达式
@Size(max,min,message = “list大小不可为0”)字符长度必须在min到max之间
@Length(min = 1,max = 4, message = “用户名不能超过4个字符”)被限制的字符串的大小必须在指定的范围内,一般用在 String 类型上可对字段数值进行最大长度限制的控制。
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@Range(min = 60,max = 80,message = “年龄必须要60到80之间,60=<年龄=<80”)被注释的元素必须在合适的范围内,一般用在 Integer 类型上可对字段数值进行大小范围的控制。

@NotEmpty、@NotBlank 以及 @NotNull 注解的使用:

@NotEmpty 用在集合或数组上面,一般用来校验List类型(不能注释枚举),而且长度必须大于0
@NotBlank 用在String上面,一般用来校验String类型不能为空,而且调用trim()后,长度必须大于0。
@NotNull 用在所有类型上面,一般用来校验Integer类型不能为空,但可以为empty。
需要搭配@Valid使用,在检验Controller的入参是否符合规范时

@JsonFormat注解:

可以约束时间的接收格式和响应格式 (接收和响应的都是JSON字符串),将日期类型数据在JSON格式和java.util.Date对象之间转换 (前端传参是json字符串格式,后端返参也是json字符串格式,JsonFormat注解会自动转化成data格式进行处理)。与传输方向没有关系(前端到后端or后端到前端都可以使用)

使用 @JsonFormat 注解时,查到的时间可能会比数据库中的时间少八个小时,这是由于时区差引起的,JsonFormat 默认的时区是 Greenwich Time, 默认的是格林威治时间,而我们是在东八区上,所以时间会比实际我们想得到的时间少八个小时。需要在后面加上一个时区,如下示例:

@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
private Date date;
常用注解属性:
名称作用
pattern约定时间格式:pattern=“yyyy-MM-dd HH:mm:ss”
timezone指定具体时区: timezone = “GMT+8” or timezone = “Asia/Shanghai”

@DateTimeFormat注解:

可对java.util.Date、java.uitl.calendar、java.long.Long及Joda时间类型的属性进行标注,主要处理前端时间类型与后端pojo对象中的成员变量进行数据绑定,所约束的时间格式并不会影响后端返回前端的时间类型数据格式(前端传参是json字符串格式,后端返参也是json字符串格式,DateTimeFormat注解会自动转化成data格式进行处理)

注意:前端入参数据的时间格式必须与注解中定义的时间格式相同,不然会报错,如:@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”) 则入参的格式必须为"2020-6-4 10:43";

常用注解属性:
名称作用
iso类型为DateTimeFormat.ISO,常用值:DateTimeFormat.ISO.DATE:格式为yyyy-MM-ddDateTimeFormat.ISO.DATE_TIME:格式为yyyy-MM-dd hh:mm:ss.SSSZDateTimeFormat.ISO.TIME:格式为hh:mm:ss.SSSZDateTimeFormat.ISO.NONE:表示不使用ISO格式的时间(默认值)
pattern类型为String,使用自定义时间格式化字符串,如"yyyy-MM-dd hh:mm:ss"
style类型为String,通过样式指定日期时间的格式,由两位字符组成,第一位表示日期的样式,第二位表示时间的格式,以下是几个常用的可选值:S:短日期/时间的样式M:中日期/时间的样式L:短日期/时间的样式F:完整日期/时间的样子-:忽略日期或时间的样式默认值 style=“SS”

@JsonFormat 和 @DateTimeFormat 区别

@JsonFormat既可以约束前端传入的时间类型参数格式,也可以约束后端响应前端的时间类型格式;

@DateTimeFormat :

  • 只能约束前端入参时间类型的格式,并不会修改原有的日期对象的格式,如果想要获得期望的日期格式,是需要自己手动转换的;
  • 如果单独使用@DateTimeFormat 时,响应给前端的时间会比实际时间晚8个小时(时区原因)

参考链接:https://blog.csdn.net/zhuzicc/article/details/106529485

@ApiModelProperty()注解:用于方法,字段; 表示对属性的说明或者数据操作更改

value–字段说明
name–重写属性名字 ,
dataType–重写属性类型
required–是否必填
example–举例说明
hidden–隐藏

@ApiModel(value="user对象",description="用户对象user")
public class User implements Serializable{
    private static final long serialVersionUID = 1L;
     @ApiModelProperty(value="用户名",name="username",example="xingguo")
     private String username;
     @ApiModelProperty(value="状态",name="state",required=true)
      private Integer state;
      private String password;
      private String nickName;
      private Integer isDeleted;

      @ApiModelProperty(value="id数组",hidden=true)
      private String[] ids;
      private List<String> idList;
     //省略get/set
}

一些校验注解的使用:

在这里插入图片描述

2、使用案例(@Valid注解的使用):

@valid注解主要用于数据校验,可定义在两种地方。

  1. 定义实体类中的属性上,添加不同的注解来完成不同的校验规则。
  2. 定义在接口类中,在接收参数前添加@Valid注解,开启实体类的校验功能。

1、在实体类中添加注解校验:

public class OrderSync {
        private static final long serialVersionUID = 1L;
        /**
         * 用户Id
         */
        @ApiModelProperty(value = "用户id") //@ApiModelProperty是swagger的注解,它的作用是添加和操作属性模块的数据
        @NotEmpty(message = "用户id不能为空")
        private String userId;
        /**
         * 购买数量
         */
        @NotNull(message = "购买数量不能为空")
        private Integer quantity;
        /**
         * 支付时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @NotEmpty(message = "支付时间不能为空")
        private LocalDateTime paymentTime;
    
        /**
         * 订单状态1、待发货 2、待收货 3、确认收货/已完成 5、已关闭
         */
        @Excel(name = "订单状态", readConverterExp = "1=待发货,2=待收货,3=确认收货/已完成 ,5=已关闭")
        @NotEmpty(message = "订单状态不能为空")
        private String orderStatus;

}

2、在接口中添加@valid注解

在controller类中添加接口,POST方法中接收设置了@Valid相关注解的实体对象,然后再参数中添加@Valid注解来开启效验功能,需要注意的是,@Valid对Get请求中接收的平面参数请求无效。

@RestController
public class TestController {
    @PostMapping("/sync")
    public String addUserInfo(@Valid @RequestBody OrderSync sync){
        return "调用成功";
    }
}

嵌套校验:

为了能够进行嵌套验证,必须手动在Person实体的son字段上明确指出这个字段里面的实体也要进行验证。

class Person {
    @NotNull
    private Integer id;

    @NotNull
    /**
     * @Validated不允许使用在成员属性上,所以只能用@Valid
     * 如果不加  @Valid 就不会对 Son类进行校验,只会判断 @NotNull,List<Son>是否为空,并不会Son类里面的成员属性
     */
    @Valid //嵌套验证
    private List<Son> son;
}

class Son {
    @NotNull
    private Integer sid;

    @NotBlank(message = "姓名不能为空")
    private String name;

}

class MemberController {

    @ApiOperation(value = "会员注册")
    @PostMapping("register")
                              //使用@Validated或者@Valid都可以,这样就完成了嵌套验证
    public JSONResult register(@Validated @RequestBody Person person, BindingResult bindingResult){

        if (bindingResult.hasErrors()) {
            System.out.println(bindingResult.getFieldError().getDefaultMessage());
            return JSONResult.error().message(bindingResult.getFieldError().getDefaultMessage());
        }
        return JSONResult.ok();
    }

}

3、@Valid 与 @Validated注解的区别:

@Valid、@Validated 注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验注解,如@NotEmpty,@NotBlank,@NotNull等等的注解就是,不加上就不会生效!
@Valid 包位置:javax.validation
@Validated 包位置 org.springframework.validation.annotation,是@Valid 的一次封装,是Spring提供的校验机制使用。

不同点:

1、使用位置:
  • @Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
  • @Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
    在这里插入图片描述在这里插入图片描述

如果@Validated注解在成员属性上,则会报 ‘@Validdated’ not applicable to field 错误:
在这里插入图片描述

2、分组上:@Valid 不支持分组, @Validated则支持分组验证。

定义分组接口:

public interface IGroupA {
}
 
public interface IGroupB {
}

定义需要检验的参数bean:

public class StudentBean implements Serializable{
    @NotBlank(message = "用户名不能为空")
    private String name;
    //只在分组为IGroupB的情况下进行验证
    @Min(value = 18, message = "年龄不能小于18岁", groups = {IGroupB.class})
    private Integer age;
    @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
    private String phoneNum;
    @Email(message = "邮箱格式错误")
    private String email;
    @MyConstraint
    private String className;
}

测试代码:检验分组为IGroupA的情况,这里对分组IGroupB的就没检验了

@RestController
public class CheckController {
    @PostMapping("stu")
    public String addStu(@Validated({IGroupA.class}) @RequestBody StudentBean studentBean){
        return "add student success";
    }
}

如果把测试代码改成下面这样,就会检验B了

@RestController
public class CheckController {
    @PostMapping("stu")
    public String addStu(@Validated({IGroupA.class, IGroupB.class}) @RequestBody StudentBean studentBean){
        return "add student success";
    }
}

说明:
1、不分 配groups,默认每次都要进行验证
2、对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。

相同点:

在检验Controller的入参是否符合规范时,使用@Validated或者@Valid都可以实现,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:

  @PostMapping("register")
                             //@Valid这两个用哪个效果都一样
    public JSONResult register(@Validated @RequestBody RegisterVo registerVo, BindingResult bindingResult){

     //会把校验失败情况下的反馈信息
        if (bindingResult.hasErrors()) {
            System.out.println(bindingResult.getFieldError().getDefaultMessage());
            return JSONResult.error().message(bindingResult.getFieldError().getDefaultMessage());
        }
        memberService.register(registerVo);
        return JSONResult.ok();
    }

总结:

1.常用校验注解@NotEmpty,@NotBlank,@NotNull,需要搭配@Valid或@Validated使用

2.@Valid或@Validated 中有 BindingResult,可以获取校验失败情况下的反馈信息,如果不添加,默认情况下会抛出对应的异常。

3.@Validated无法单独提供嵌套验证功能。不能用在成员属性上,能配合嵌套验证注解@Valid进行嵌套验证。

4.@Valid无法单独提供嵌套验证功能。能够用在成员属性上,能配合嵌套验证注解@Valid进行嵌套验证。

参考链接:https_blog.csdn.net/?url=https%3A%2F%2Fblog.csdn.net%2Fm0_46459413%2Farticle%2Fdetails%2F134301052

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode中Vue别名路径提示的实现

配置文件中配置别名&#xff1a; 在对应的jsconfig 或者 tsconfig文件中 配置&#xff1a; 文件中使用时候就会出现相应提示&#xff1a;

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

从HTTP到HTTPS:SSL加密如何重塑互联网安全格局

从HTTP到HTTPS&#xff1a;SSL加密如何重塑互联网安全格局 随着互联网技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;保护用户数据的安全性和隐私性成为了不可忽视的重要议题。从HTTP&#xff08;超文本传输协议&#xff09;到HTTPS&#xff08;超文本传输安全协…

webrtc ns 降噪之粉红噪声参数推导

webrtc中降噪中&#xff0c;前50帧需要进行简单噪声估计&#xff0c;使用白噪声和粉红噪声模型估算。 首先我们 复习 有色噪声&#xff08;包含白噪声&#xff09;的一般模型&#xff1a; S(f) 是频率 f 处的功率谱密度。f是频率。α 是一个频谱指数&#xff0c;通常在1左右。…

如何使用ssm实现海鲜自助餐厅系统+vue

TOC ssm068海鲜自助餐厅系统vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以及管理需…

【C++ Primer Plus习题】3.3

问题: 解答: #include <iostream> using namespace std;const int DE_TO_MI 60; const int MI_TO_SE 60;int main() {int degree 0, minute 0, second 0;float degrees 0;cout << "请输入度:";cin >> degree;cout << "请输入分…

Selenium + Python 自动化测试23(综合实战)

我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架、数据驱动结合起来使用。 本篇文章我们综合一下之前学习的内容,试着编写实际项目易用的测试用例脚本。 今天应该是此项目最后一次分享,大家快看,有完整的…

IntelliJ IDEA的maven配置

前言 在 IntelliJ IDEA 中&#xff0c;Maven 的默认配置文件是 settings.xml&#xff0c;它通常位于以下路径&#xff1a; 配置文件位置 全局配置文件&#xff1a; Windows: %USER_HOME%\.m2\settings.xmlmacOS/Linux: ~/.m2/settings.xml 这个文件是 Maven 的全局配置文件。…

闲鱼IP属地地址:去外地会自动变化吗?解析实时更新机制

在数字化时代&#xff0c;网络交易平台如闲鱼已成为我们日常生活中不可或缺的一部分。在进行二手交易时&#xff0c;了解对方的地理位置信息成为许多买家和卖家的关切点。那么&#xff0c;去外地闲鱼IP会变吗&#xff1f;闲鱼IP属地地址是实时更新吗&#xff1f;本文将深入探讨…

C#开发基础之I/O 异步和多线程异步:本质上的区别与使用场景

前言 在桌面软件开发中&#xff0c;异步编程是一种至关重要的技巧&#xff0c;尤其是在需要提高应用程序响应性和并发处理能力时。常见的异步编程模式主要包括 I/O 异步和多线程异步&#xff0c;这两者虽然都实现了非阻塞操作&#xff0c;但在本质上有着显著的区别。理解它们的…

USB分析仪USB3.2日志分析

1.简介 USB2.0总线采用轮询模式&#xff0c;即总线事务开始时&#xff0c;都要先发送IN或者OUT令牌包&#xff0c;以通知端点或者查询端点是否准备好。而USB3.2采用了异步通知模式&#xff0c;若端点没有准备好&#xff0c;则主机无需轮询&#xff0c;端点准备好后会通知主机&…

进程创建:fork函数

fork函数 在Linux系统中&#xff0c;fork函数是用于创建一个新的进程的函数。调用fork函数会创建一个新的进程。 fork函数的原型如下&#xff1a; #include <unistd.h>pid_t fork(void);fork函数没有参数&#xff0c;返回值是一个pid_t类型的值。在成功创建新的进程后…

Python酷库之旅-第三方库Pandas(094)

目录 一、用法精讲 401、pandas.Series.to_string方法 401-1、语法 401-2、参数 401-3、功能 401-4、返回值 401-5、说明 401-6、用法 401-6-1、数据准备 401-6-2、代码示例 401-6-3、结果输出 402、pandas.Series.to_clipboard方法 402-1、语法 402-2、参数 40…

【精选】基于python的影片数据爬取与数据分析

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

推荐4款2024年PDF转图片的神器武器!

平时很多人都会经常遇到需要将 PDF 文件转换为图片的情况&#xff1b;不管是因为方便分享、展示内容&#xff0c;还是其他特殊需求&#xff0c;PDF 转图片工具都能起到很大的帮助。今天&#xff0c;就来跟大家分享4个特别好用的PDF转图片的工具。 1、365PDF转换软件 直通车&am…

live chart 仪表盘和饼图 示例

先上图&#xff1a; 下面是代码&#xff1a; <!--第一个卡片--><GroupBox Header"各生产线人数"><Grid><Grid.RowDefinitions><RowDefinition Height"45"/><RowDefinition/><RowDefinition Height"auto"…

RK3588编译CH343驱动

文章目录 1. 概述。2. ko编译3.环境构建3.1 集成ch343驱动3.2 修改内核配置3.3 编译内核模块3.4 部署安装 最近在RK3588的开发板上要接一个外部的小板&#xff0c;需要使用的ch343驱动&#xff0c;但是rk3588的板子上没有自带的ch343的驱动&#xff0c;就需要自己手动编译一个c…

Java基础学习篇:switch条件语句进阶(最详细版)

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…

【KivyMD 应用程序 1.1.1】Icons在应用设计中的魅力

图标,这些小小的视觉元素,拥有不可思议的力量,能够跨越语言和文化的障碍,传达丰富的信息。在数字时代,图标的设计和应用已经成为界面设计不可或缺的一部分,而Material Design Icons则是这个领域的佼佼者。 Material Design Icons源自Google的Material Design语言,旨在创…

剑指offer 30. 包含min函数的栈

目录 原题链接 题目描述 解决方案 思路分析 核心思路 流程图解 操作细节 代码实现 Python 语言实现 C 语言实现 Java 语言实现 复杂度分析 总结 其他相似题目 原题链接 剑指offer_在线编程_牛客网 (nowcoder.com) 题目描述 定义一个栈的数据结构&#xff0c;并…