一、事有起因

  我们在与前端交互的时候,一般会遇到字段格式校验及非空非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. DBusConnection for c

    dbus的C API D-Bus 1.13.10 目录 dbus的C API Detailed Description Typedef Documentation ◆ DBusAddTimeoutFu ...

  2. CentOS7——配置阿里云镜像源

    CentOS7--配置阿里云镜像源 #下载CentOS 7的repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun ...

  3. 🧑🏻‍💻数据库简介及Mac平台环境搭建🧑🏻‍💻

    数据库 存储数据的演变过程 如果没有使用数据库,我们自己存放文件,数据格式是千差万别的,完全取决于我们自己,例如: """ # 张三 zhangsan|123|read ...

  4. opencv3.1.0 计算机中丢失 opencv_world310d.dll _vs2017解决方法

    ---------------------------opencv1.exe - 系统错误---------------------------无法启动此程序,因为计算机中丢失 opencv_worl ...

  5. STM32单片机应用与全案例实践 /stm32自学笔记 第二版 pdf

    STM32单片机应用与全案例实践pdf https://pan.baidu.com/s/16WrivuLcHvLTwS__Zcwl6Q 4rj3 stm32自学笔记 第二版 pdf https://p ...

  6. MOJITO 发布一周,爬一波弹幕分析下

    MOJITO 最近一直啥都没写,追个热点都赶不上热乎的,鄙视自己一下. 周董的新歌 「MOJITO」 发售(6 月 12 日的零点)至今大致过去了一周,翻开 B 站 MV 一看,播放量妥妥破千万,弹幕 ...

  7. [ 头皮发麻 A1 ] 队内赛3 2020 Ateneo de Manila University DISCS PrO HS Division

    都是英语阅读题 但是本菜鸡就过了一题,直接自闭mmp明天开始起床一版题 传送门 B.Riana and the Blind Date 0是闰年?惊了 后来才知道整除被除数可以为0 闰年的计算方法 \( ...

  8. tomcat中AJP协议和HTTP协议的区别

    tomcat的server.xml中的AJP和HTTP连接器区别 HTTP协议:连接器监听8080端口,负责建立HTTP连接.在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器. ...

  9. IWAB0398E Error in generating WSDL from Java: java.lang.ClassNotFoundException

    今天想用Eclipse创建WebService,报错信息 IWAB0398E Error in generating WSDL from Java: java.lang.ClassNotFoundEx ...

  10. Python3-os模块-操作系统的各种接口

    Python3中的os模块提供了一个便携的方式去使用操作系统的相关功能 os.name 返回导入的操作系统相关模块的名字,如 posix(unix/linux),nt(windows)等 os.env ...