zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【CF 359B】Permutation
    如何更新 DevC++ 的编译器
    【LG 2801】教主的魔法
    矩阵浅谈
    NOI 系列赛常见技术问题整理
    Treap 浅谈
    DP 优化浅谈
    友链
    【CF 708C】Centroids
    我跳过的坑
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15007830.html
Copyright © 2011-2022 走看看