springboot数据格式验证(一)

一、概述

在项目中,经常需要验证客户端传过来的数据格式,如果都用if else手写,可能会累死,其实javax.validation包与hibernate-validator包中注解能满足大部分需求

我们先来熟悉一下

引用jar包不说明依赖都是耍流氓,所以我先把用到的依赖粘贴在这里

复制代码
 <!--jsr 303-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.0.Final</version>
        </dependency>
复制代码

二、常用验证注解

常用的注解大概就这些,大部分都是应用在model类的字段上,大概能解决80%的问题

复制代码
@Null  被注释的元素必须为null
@NotNull  被注释的元素不能为null
@AssertTrue  被注释的元素必须为true
@AssertFalse  被注释的元素必须为false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)  被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty  被注释的字符串必须非空
@Range  被注释的元素必须在合适的范围内
复制代码

Hibernate Validator 提供的校验注解:

@NotBlank(message =) 验证字符串非 null,且长度必须大于 0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

 

用起来其实很简单,我展示一个例子,下面的model类Tables映射为一张表,有些关键字段肯定是不能为空的,我都用@NotNull注解进行了标识

复制代码
@Data
@Table(name = "tables",
        uniqueConstraints = {@UniqueConstraint(columnNames = {"tbName"})})
public class Tables implements Serializable {

    private static final long serialVersionUID = -3596411984380984035L;

    @ApiModelProperty("表名,必须为英文小写")
    @NotNull(message = "tbName不能为空")
    private String tbName;

    @ApiModelProperty("表描述")
    @NotNull(message = "chineseName不能为空")
    private String chineseName;

    @ApiModelProperty("表唯一键")
    private String uniqueKey;

    @ApiModelProperty("创建日期")
    @DateFormat(format = "yyyy-MM-dd",message = "日期格式错误,正确格式为yyyy-MM-dd")
    private String createDate;
}
复制代码

三、controller层的使用

在controller层使用的时候一定要在待校验参数前加@Validated注解才能生效

复制代码
    @PostMapping("addTable")
    @ApiOperation("增加一个表")
    public BaseResponse<String> addTable(@Validated @RequestBody Tables tables, BindingResult br) {
        if (br.hasErrors()) {
            String defaultMessage = br.getFieldError().getDefaultMessage();
            return BaseResultUtils.error(defaultMessage);
        } else {
            modelService.createTB(tables);
            return BaseResultUtils.success(null);
        }
    }
复制代码

四、返回给前端

错误日志打印给自己虽然有用,但不如直接返回到前端更智能,为了实现这个功能,就需要用到上面方法中的BindingResult,它保存了验证得到的错误,将错误拿出来就可以返回给前端

大概是如下这种效果

 

参考:https://www.jianshu.com/p/253642121891

 

posted @   Mars.wang  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2020-07-13 在Scala中使用fastJson
点击右上角即可分享
微信分享提示