一、事有起因

  我们在与前端交互的时候,一般会遇到字段格式校验及非空非null的校验,在没有SpringBoot注解的时候,

我们可能会在service进行处理:

if(null == name){
throw new BizException("-1", "用户名不能用空");
}

要是有20个字段需要插入,那我们岂不需要书写20遍这样的代码,当然这种事最直接的解决方式,但作为程序员,我们

首要的任务是要能完成需求到代码的转化,同时还要不断思考如何更加丝滑的写代码,不要重复造轮子。

在进入正题之前我们先认识下以下3位老朋友:

 
entity 用于抽象数据库中的字段,不断任何处理
dto/vo/bean 作为前端数据与数据库的桥梁,一般我们是一个接口,一个dto,我们的判空也是需要结合dto处理
controller 用于接受前端的请求,我们的判空也是在controller层进行的

  就此我们正式的开始探索Valid与Validated的旅程

二、判空逻辑的具体实现

2.1、使用的包及注解

2.2、注解的含义

@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(regex=,flag=)     被注释的元素必须符合指定的正则表达式
Hibernate Validator       提供的校验注解:
@NotBlank(message =)      验证字符串非null,且长度必须大于0
@Email               被注释的元素必须是电子邮箱地址
@Length(min=,max=)        被注释的字符串的大小必须在指定的范围内
@NotEmpty            被注释的字符串的必须非空
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

2.3、dto上使用具体需要判断的注解

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SiteProjectCreateReq implements Serializable { private static final long serialVersionUID=1L; @NotEmpty(message = "项目类型不能为空") //一旦为空就用抛出异常,我们统一异常处理就会拦截,然后将message信息给前端 private String type; }

2.4、controller使用@Valid开启注解

public interface SiteProjectApi {

   //如果是集合或者其他数据结构,则需要在接口或者类上加@Validated
@PostMapping(value = "/createProject")
SResponseBean createProject(@RequestBody @Validated SRequestBean<List<SiteProjectCreateReq>> createReqs);
  //如果入参是entity,那我们加上@Valid即可,dto中注解就可以生效
@PostMapping(value = "/createProject")
SResponseBean createProject2(@RequestBody @Valid SiteProjectCreateReq createReqs);
 }
@Data
public class SRequestBean<T> implements Serializable {
@Valid
   CommonHeaderReq header;    @Valid
T body;
}
/**
* Validated 加在类或者接口上
* Valid 加在具体的entity或者dto
@validated和@valid都可以用在controller层的参数前面,但这只能在controller层生效。
*/

2.5、当不满足条件时,获取错误信息返回

  注意:不同的注解,抛出的异常可能不一样,获取方式也不一样,可以调试加上拦截

@RestControllerAdvice()
public class SiteExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleException(HttpServletRequest request, MethodArgumentNotValidException e){
LoggerUtil.error("出现异常======> [{}] ",e);
//此处获取@NotEmpty(message = "项目类型不能为空"),中的message
     String message = e.getBindingResult().getAllErrors().stream().findFirst().get().getDefaultMessage();
     return SResponseUtil.output("01", message); }
}

2.6、再说一句

  一般我们拿到需求,产品经理会根据需求,形成原型。前端设计界面,后台设计数据库。

针对于非空字段,一般需要做以下几点:

  1、前端在发往后端的时候会进行一次拦截。

  2、后端controller进行拦截一次。

  3、生成的swaager文档,需要标明必输。

  4、数据库设计,需要设计成非空。

三、偷得浮生一刻闲

3.1、新鲜事 

  网传阿里P9员工出轨P7已婚女下属

《SpringBoot判空处理》接开@valid的面纱的更多相关文章

  1. 在Java中如何优雅地判空

    判空灾难 ​ 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来 ...

  2. AOP实现参数的判空问题

    不想每次都去判断必传的参数是否为空,写代码太繁琐了,正好最近用了AOP实现权限控制,依葫芦画瓢,现在用它实现参数的判空,至于AOP的原理之类,自己百度了解一下吧 1. NullDisable注解 @D ...

  3. java中判空

    一.概述 java中判等似乎很简单,==用来判断对象引用(内存地址)是否相同,equals用来判断值是否相同.你可以试用String对象轻松区分这一点. 那么在null判等(也就是判空操作)时呢? 可 ...

  4. JSTL: empty 可以减少很多繁冗的判空(转)

    ${empty student.name }Empty是判空为空返回的真不为空返回的是假 ${(empty student.name)? '空' : '非空'} <c:if test=" ...

  5. mybatis xml的无效判空

    <insert id="insert"> <if test="xxxMappingEntityList != null and xxxMappingEn ...

  6. StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)

      Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方 ...

  7. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

  8. 使用foreach需要判空。

    今天写代码的时候,需要遍历一个作为参数传递进来的容器, 当时顺手就加上了判空条件: if(null==list)return; 后来就像,不知道遍历(foreach)有没有帮我做这个工作: 下面看实验 ...

  9. jquery判空 string类型的日期比较大小

    jquery 判空 if(value.length<=0){  alert("kongzhi"); } jquery string类型的日期比较大小 var startTim ...

随机推荐

  1. 07.Django-缓存

    目录 缓存 一.如何提高网站并发量? 二.缓存方式 1. 开发调式缓存 2. 内存缓存 3. 文件缓存 4. 数据库缓存 5. Memcache缓存 5.1 使用python-memcached模块 ...

  2. blob斑点检测

    目录 1. 可选算法 1.1. Laplacian of Gaussian (LoG) 1.2. Difference of Gaussian (DoG) 1.3. Determinant of He ...

  3. c常用函数-strchr和strrchr

    strchr和strrchr strrchr函数用于查找指定字符在一个字符串中最后一次出现的位置,然后返回指向该位置的指针 strchr函数用于查找指定字符在一个字符串中第一次出现的位置,然后返回指向 ...

  4. 面向对象存储框架:Obase快速入门

    在项目中完成对象建模后,可以使用Obase来进行对象的管理(例如对象持久化),本篇教程将创建一个.NET Core控制台应用,来展示Obase的配置和对象的增删改查操作.本篇教程旨在指引简单入门. 本 ...

  5. 数据库语言sql

    数据库语言SQL SQL的形式 交互式SQL 一般DBMS都提供联机交互工具 用户可直接键入SQL命令对数据库进行操作 由DBMS来进行解释 嵌入式SQL 能将SQL语句嵌入到高级语言(宿主语言) 使 ...

  6. 消息队列——RabbitMQ的基本使用及高级特性

    文章目录 一.引言 二.基本使用 1. 简单示例 2. work queue和公平消费消息 3. 交换机 三.高级特性 1. 消息过期 2. 死信队列 3. 延迟队列 4. 优先级队列 5. 流量控制 ...

  7. Idea 快捷生成类注释与方法注释

    这篇博客应该在刚使用IDEA 的时候就写了.  但是一直忘了.  今天使用新的api 接口文档生成工具 JApiDocs  的时候,看其上面有编码规范, 注释规范. 就想起了IDEA 类中, 方法中快 ...

  8. Linux中bash的一些命令

    Linux——bash的简单使用 bash及其特性: 1.bash实质上是一个可执行的程序,一个用户的工作环境. 2.每一个shell下可以再打开一个shell,新打开的shell称为子shell,每 ...

  9. Redis设置并查看最大连接数

    在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的. maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改 ...

  10. 第四模块 :微服务调用链监控CAT架构和实践

    采样率:每一个请求为都进行记录,或者100次请求为记录50次 各个开源框架都满足opentracing的标准,只要使用opentracing标准埋点的客户端,可以使用不同的客户端去展示,opentra ...