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 @ 2021-07-13 18:19  Mars.wang  阅读(550)  评论(0编辑  收藏  举报