一、事有起因

  我们在与前端交互的时候,一般会遇到字段格式校验及非空非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. oracle使用+简写左关联出现的结果集不一致问题

    这是使用(+)的sql语句(已简写) select a.id,b.num from a,b where a.id=b.id(+) and b.num>10 这是使用left join的sql语句 ...

  2. blob斑点检测

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

  3. LVS实现四层负载均衡

    LVS详解(思维导图) 1. 集群概述 1.1 Linux Cluster Linux Cluster的类型 LB(Load Balance) HA(High Available) HP(High P ...

  4. Stones【中石油个人赛第十七场I】

    Stones 题目链接(传送门) 来源:upc12899 题目描述 There are N stones arranged in a row. Every stone is painted white ...

  5. git安装和第一次提交过程

    1,新建文件夹test,运行命令 git init 2,找到test的.git文件夹,打开之后找到config文件,在最后边加上一句话 [user] email=your email name=you ...

  6. 使用SSH远程管理时本地文件被修改了

    背景: 有两个网段:1段作为工作网段即员工办公用:2段作为专用网段配置了一系列需要的环境. 在Ubuntu 16.04用Python的SSH工具在对这两个网段远程管理,我写了一个检测环境的脚本,用SF ...

  7. Android学习笔记基于监听的事件处理

    事件处理流程 代码格式: Button btn1 = findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener ...

  8. HTML中doctype的作用及几种类型详解

    一.DOCTYPE标签的定义与作用 <!DOCTYPE>是一个用于声明当前HTMl版本,用来告知web浏览器该文档使用是哪种 HTML 或者 XHTML 规范来解析页面,以便浏览器更加准确 ...

  9. ca72a_c++_标准IO库:面向对象的标准库

    /*ca72a_c++_标准IO库:面向对象的标准库继承:基类->派生类3个头文件9个标准库类型IO对象不可复制或赋值 ofstream, f--file,文件输出流ostringstream, ...

  10. hystrix信号量和线程池的区别