《SpringBoot判空处理》揭开@Valid与@Validated的面纱

一、事有起因

  我们在与前端交互的时候,一般会遇到字段格式校验及非空非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=)   被注释的元素必须在合适的范围内

@Pattern扩展性十分高,可以借正则表达式,针对各种场景进行拦截,具体常见的正则表达式可以参考如下文章:
https://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html

 

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已婚女下属🤣

3.2、歌曲推荐

  童年,这首歌相信大家都很熟悉,小时候那份童真每每想起,嘴角总会上扬,这首粤语版,不失另一种韵味。

 

 

3.3、影视推荐

  2001太空漫游 2001: A Space Odyssey (1968),我个人始终相信人类是渺小的,宇宙若只有人类,岂不白白浪费。

保持敬畏,保持探索精神。

  推荐理由,标新立异,伟大的科幻片。

 

 3.4、养眼壁纸

posted @ 2020-07-09 22:21  垚森  阅读(1208)  评论(2编辑  收藏  举报